ข้างในของ Request/Response
HTTP message = text 3 ส่วน: start line, headers, body ดูตัวอย่างจริงทั้ง request และ response ของแอพกาแฟ
ตอนนี้เรารู้แล้วว่า client ส่ง request ไปยัง URL ไหน แต่ “request” ที่ส่งไปจริงๆ หน้าตาเป็นยังไง?คำตอบอาจจะเรียบง่ายกว่าที่คิด HTTP message เป็นแค่ text ธรรมดาที่มีโครงสร้างตายตัว ถ้าเห็นครั้งเดียวก็จำได้ตลอดชีวิต
HTTP message คืออะไร
- Request และ Response ต่างก็เป็น HTTP message คือข้อความที่ client กับ server ส่งหากันตามฟอร์แมตของ HTTP
- เป็น text ล้วนๆ (ใน HTTP/1.1) เปิดอ่านด้วยตาเปล่าได้ ไม่ใช่รหัสลับอะไร
- ทั้ง request และ response มี โครงสร้าง 3 ส่วน เหมือนกัน ต่างกันแค่เนื้อหาในส่วนแรก
Mental model: ซองจดหมาย
คิดถึงจดหมายที่เราเขียนส่งไปรษณีย์
- หน้าซอง บอกว่าจดหมายจะไปที่ไหน ถึงใคร (เหมือน start line ใน HTTP)
- ข้อมูลประกอบ เช่น stamp, ประเภทไปรษณีย์ EMS (เหมือน headers)
- กระดาษเปล่า 1 แผ่น คั่นระหว่างซองกับเนื้อใน
- เนื้อจดหมาย เนื้อหาจริง (เหมือน body)
HTTP message ก็มี 4 ส่วนนี้เรียงจากบนลงล่าง ต่างแค่เขียนเป็น text ในไฟล์เดียวกัน
โครงสร้าง 3 ส่วนของ HTTP message
- Start line บรรทัดแรกสุด บอกว่าอยากทำอะไร (ถ้าเป็น request) หรือผลเป็นยังไง (ถ้าเป็น response)
- Headers ข้อมูลประกอบ บรรทัดละ 1 อย่าง รูปแบบ
Key: Valueมีกี่บรรทัดก็ได้ - Empty line + Body บรรทัดว่าง 1 บรรทัดคั่น แล้วตามด้วยเนื้อหาจริง (ถ้ามี)
บรรทัดว่างสำคัญมาก เป็นตัวบอกว่า “headers จบแล้ว อะไรต่อไปคือ body” ถ้าไม่มีบรรทัดว่าง server/client จะแยกไม่ออกว่า header จบตรงไหน
หน้าตาของ Request
ลองดู request ที่ browser ส่งไปตอนเปิดหน้าอเมริกาโน่ในแอพกาแฟ
Request start line
- ตัวอย่าง:
GET /menu/americano HTTP/1.1 - ประกอบด้วย 3 ชิ้นคั่นด้วย space
- Method ต้องการทำอะไร (GET, POST, ฯลฯ) จะเรียนในบทถัดไป
- Path ชี้ไป resource ไหน (จากบทก่อน)
- HTTP version ใช้ HTTP เวอร์ชันอะไร (1.1, 2.0)
Request headers
- แต่ละบรรทัดรูปแบบ
Name: Value Hostย้ำว่าจะคุยกับ server ชื่อไหน (1 server 1 IP อาจมีหลาย site)Acceptบอกว่า client อยากได้ response รูปแบบไหน (JSON, HTML, รูป)User-Agentบอกว่าใครเป็นคนส่ง (browser อะไร, OS อะไร, app อะไร)- Header ตั้งเองได้ มีชื่อเป็นมาตรฐานหลายสิบตัว จะเจาะลึกในบทที่ 6
หน้าตาของ Response
พอ server ประมวลผลเสร็จ มันส่ง response กลับ โครงสร้างเหมือน request เป๊ะ แค่บรรทัดแรกเปลี่ยนและมี body
Response start line
- ตัวอย่าง:
HTTP/1.1 200 OK - ประกอบด้วย 3 ชิ้น
- HTTP version เวอร์ชันที่ server ใช้ตอบ
- Status code เลขสถานะ บอกผลการขอ (200 = สำเร็จ, 404 = ไม่เจอ) จะเรียนในบท 5
- Reason phrase คำอธิบายสั้นๆ ของ status (OK, Not Found, Internal Server Error)
Response headers
Content-Typeบอกว่า body เป็นข้อมูลรูปแบบไหน (JSON, HTML, รูป PNG, ฯลฯ)Content-Lengthbody ยาวกี่ byte client ใช้เช็คว่าโหลดครบหรือยัง- อีกหลายตัวเช่น
Set-Cookie,Cache-Control,Server
Response body
- เนื้อหาจริงที่ client ขอ
- อาจเป็น HTML, JSON, รูปภาพ (ในรูปของ binary), วิดีโอ, ไฟล์ PDF
- Response บางประเภทไม่มี body เช่น 204 No Content (ลบของเสร็จเรียบร้อย ไม่ต้องส่งอะไรกลับ)
เปรียบเทียบ Request กับ Response แบบ side-by-side
GET /menu/americano HTTP/1.1- 1Method ต้องการทำอะไร (GET/POST/...)
- 2Path ชี้ไป resource ไหน
- 3Version ใช้ HTTP เวอร์ชันอะไร
คำศัพท์จากบทนี้
- HTTP message ข้อความที่ client/server ส่งหากัน ทั้ง request และ response
- Start line บรรทัดแรกของ message บอก method/path (request) หรือ status (response)
- Headers ข้อมูลประกอบ key-value รายบรรทัด
- Body เนื้อหาจริง (HTML, JSON, รูป) อยู่หลัง empty line
- Empty line บรรทัดว่าง คั่น headers กับ body
- HTTP version เวอร์ชันที่ใช้ เช่น HTTP/1.1, HTTP/2
สรุป
- HTTP message = text ธรรมดา มี 3 ส่วน: start line + headers + body
- Request start line:
METHOD PATH HTTP/VERSION - Response start line:
HTTP/VERSION STATUS REASON - Headers เป็น
Name: Valueกี่บรรทัดก็ได้ - บรรทัดว่างสำคัญ คั่น headers กับ body
- Body อาจมีหรือไม่มี ขึ้นกับประเภท request/response
ตอนนี้เห็นโครงของ message แล้ว ใน start line ของ request มีคำว่า GETนั่นคือ HTTP Method ที่บอก server ว่าอยากทำอะไรกับ resource บทถัดไปเราจะดู method ครบทุกตัวที่ใช้บ่อย (GET, POST, PUT, PATCH, DELETE) และเรียนคำสำคัญคำหนึ่งชื่อ idempotent ที่ทำให้แยก method ได้ถูก