Headers คือ metadata ของ message
รู้จัก header ที่ใช้บ่อย 4 หมวด (Content, Auth, Cache, ทั่วไป) ทำไมต้องแยก metadata จาก body
ใน HTTP message บท 3 เราเห็นบรรทัดกลางๆ ที่รูปแบบเป็น Key: Value เรียงกันหลายบรรทัด พวกนั้นคือ headers ข้อมูลประกอบของ request หรือ response
headers ดูเหมือนไม่สำคัญเพราะเป็นแค่ข้อมูลเสริม แต่จริงๆ คือหัวใจที่ทำให้ทุกอย่างทำงาน ตั้งแต่บอกประเภทข้อมูล ยัน authentication ไปจนถึง cache และ CORS
Header คืออะไร
- Metadata (ข้อมูลเกี่ยวกับข้อมูล) ของ HTTP message ไม่ใช่เนื้อหาจริง แต่เป็นคำอธิบายเนื้อหานั้น
- รูปแบบ
Name: Valueคั่นด้วยบรรทัดใหม่ มีกี่บรรทัดก็ได้ - Name เป็น case-insensitive (
Content-Typeกับcontent-typeเหมือนกัน) - มีได้ทั้งใน request และ response บางตัวอยู่ได้ทั้ง 2 ฝั่ง บางตัวใช้ได้ฝั่งเดียว
ทำไมต้องแยก header กับ body
นึกถึงพัสดุ EMS กล่องข้างในคือเนื้อหา ป้ายหน้ากล่อง (ผู้ส่ง/ผู้รับ/น้ำหนัก/ประเภท) คือ header ถ้าไปรษณีย์ต้องเปิดกล่องดูก่อนทุกครั้งจะช้ามาก แต่อ่านแค่ป้ายก็ตัดสินใจได้แล้ว
- Server/client อ่าน header ก่อน body ตัดสินใจได้ว่าจะอ่าน body ต่อหรือ reject
- Proxy และ cache ใช้ header ตัดสินใจ cache, route, load balance โดยไม่ต้องอ่าน body
- ประหยัด bandwidth ถ้า header บอกว่า client รับไม่ได้ server ไม่ต้องส่ง body ใหญ่ๆ
Header ที่เจอบ่อยที่สุด
หมวดที่ 1: Content (บอกว่า body เป็นอะไร)
Content-Typeบอกประเภทของ body ใช้ในทั้ง request และ responseapplication/jsonbody เป็น JSONtext/htmlbody เป็นหน้าเว็บ HTMLimage/pngbody เป็นรูป PNGapplication/x-www-form-urlencodedbody เป็น form แบบ query-stringmultipart/form-dataform ที่มีไฟล์แนบ
Content-Lengthขนาด body เป็น byte ช่วยให้ผู้รับรู้ว่าควรรับมาเท่าไหร่Content-Encodingวิธีบีบอัด body เช่นgzip,brช่วยลด bandwidth มหาศาล
หมวดที่ 2: Auth (ยืนยันตัวตน)
Authorizationส่ง token หรือ credential รูปแบบที่พบบ่อยBearer abc123...(token เฉยๆ) หรือBasic base64(user:pass)Cookieส่ง cookie ที่ browser เคยรับจาก server กลับคืน ใช้เก็บ sessionSet-Cookie(response) server บอก browser ให้เก็บ cookie ไว้ ครั้งต่อไป browser จะส่งคืนอัตโนมัติWWW-Authenticate(response) server บอกวิธี auth ถ้าเจอ 401
เรื่อง auth โดยละเอียดจะเจาะในบทที่ 9
หมวดที่ 3: Cache (ทำให้เร็วขึ้น)
Cache-Controlบอกว่า response นี้ cache ได้นานแค่ไหนmax-age=3600cache ได้ 1 ชั่วโมง (3600 วินาที)no-cacheใช้ cache ได้ แต่ต้องเช็คกับ server ก่อนno-storeห้าม cache เด็ดขาด (เช่นหน้า banking)
ETag(response) รหัสเวอร์ชันของ resource ครั้งต่อไป client ถามกลับด้วย ETag เดิม server ตอบ304 Not Modifiedไม่ต้องส่ง body ใหม่Last-Modified/If-Modified-Sinceอีกแบบของการเช็คเวอร์ชัน
หมวดที่ 4: ข้อมูลประกอบทั่วไป
Host(request) บอกว่าจะคุยกับ domain อะไร server 1 เครื่องอาจให้บริการหลาย domain ต้องใช้ Host แยกUser-Agent(request) บอกว่า client คือ browser/app อะไร OS อะไร server ใช้ปรับ response ตาม deviceAccept(request) client อยากได้ response แบบไหน (JSON, HTML, ...)Accept-Language(request) ภาษาที่ client อยากได้ (เช่นth-TH)Location(response) ใช้คู่กับ 3xx redirect บอก URL ปลายทาง
ตัวอย่างจากแอพกาแฟ
เวลาสั่งกาแฟ browser ส่ง request ไปที่ POST /orders หน้าตาประมาณนี้
- MiscHost:coffeeshop.com
- ContentContent-Type:application/json
- ContentContent-Length:58
- AuthAuthorization:Bearer abc123
- MiscAccept:application/json
- MiscUser-Agent:Mozilla/5.0 (iPhone)
- ContentContent-Type:application/json
- ContentContent-Length:120
- AuthSet-Cookie:session=xyz789; Path=/; HttpOnly← server ฝาก cookie ให้ browser เก็บ
- CacheCache-Control:no-store
Custom header: ตั้งเองได้
ถ้าต้องการใส่ข้อมูลที่ไม่มีใน standard header ทำได้เลย ตั้งชื่อเองตามใจ
- ตัวอย่างที่พบจริง:
X-Request-ID(เลข unique ของแต่ละ request สำหรับ debug),X-RateLimit-Remaining(request คงเหลือก่อนโดน rate limit),X-Forwarded-For(IP จริงของ client เมื่อผ่าน proxy) - เมื่อก่อนนิยม prefix
X-สำหรับ custom header แต่ตั้งแต่ปี 2012 RFC 6648 บอกว่าไม่จำเป็น ปัจจุบันเห็นทั้ง 2 แบบ
คำศัพท์จากบทนี้
- Header ข้อมูลประกอบ (metadata) ของ HTTP message
- Content-Type บอกประเภทของ body
- Authorization ส่ง token/credential สำหรับ auth
- Cookie / Set-Cookie แลกเปลี่ยน cookie ระหว่าง client-server
- Cache-Control กำหนดกติกาของ cache
- User-Agent บอกว่า client คือ app อะไร
- Host / Accept ข้อมูลประกอบของ request
- Custom header header ที่ไม่ใช่มาตรฐาน ตั้งชื่อเองได้
สรุป
- Header = metadata ของ message อยู่ระหว่าง start line กับ body
- รูปแบบ
Name: Valuename case-insensitive - แบ่งเป็นหมวดหลัก: Content, Auth, Cache, ข้อมูลทั่วไป
- Content-Type ต้อง match body ถึงจะ parse ได้ถูก
- Custom header ตั้งเองได้ X-prefix ไม่จำเป็นแล้ว
- Header ต้องเป็น ASCII ถ้าต้องส่งภาษาไทยใช้ body
พูดถึง body มาหลายครั้งแล้ว body คือส่วนที่ “ข้อมูลจริง” อยู่ ในงานปัจจุบัน 90% ของ API body คือ JSONบทถัดไปเราจะเจาะว่า JSON คืออะไร เขียนยังไง และทำไมใช้กันทุก API พร้อม Content-Type ที่ต้องใช้ให้ match