WEB · บทที่ 1 Web และ HTTP

หัวข้อ 2 · 18 นาที

HTTP message, status code และ Content-Type

นึกภาพก่อน

จดหมายราชการมีแบบฟอร์มตายตัว: บรรทัดแรกบอกเรื่อง ถัดมาเป็นข้อมูลกำกับ (ถึงใคร วันที่ เลขที่) เว้นบรรทัด แล้วจึงเป็นเนื้อความ HTTP message ก็เป็น ข้อความธรรมดาที่มีรูปแบบตายตัว แบบนั้น อ่านด้วยตาได้ และทั้ง request กับ response ใช้โครงเดียวกัน: บรรทัดแรก → headers → บรรทัดว่าง → body

HTTP คืออะไร

  • protocol สำหรับดึง resource เช่น เอกสาร HTML รวมถึงรูปภาพและวิดีโอ
  • เป็น protocol แบบ text-based และ client–server
  • เป็น application layer protocol ที่ ส่งผ่าน TCP
Protocoldefault port
HTTP80
HTTPS443

HTTPS คือวิธีส่งข้อมูลระหว่าง web server กับ web browser อย่าง ปลอดภัย

HTTP flow

เมื่อ client ต้องการคุยกับ server:

  1. เปิด TCP connection
  2. ส่ง HTTP message (request message)
  3. อ่าน response ที่ server ส่งกลับ
  4. ปิด connection — หรือใช้ซ้ำกับ request ถัดไป

HTTP request message

http
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr

ส่วนในตัวอย่างความหมาย
MethodGETต้องการทำอะไร
Path/กับ resource ใด
Protocol versionHTTP/1.1เวอร์ชันของ HTTP
HeadersHost, Accept-Languageข้อมูลกำกับ รูปแบบ ชื่อ: ค่า

ปิดท้าย headers ด้วย บรรทัดว่าง (CRLF) เพื่อบอกว่า headers จบแล้ว

HTTP response message

http
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html

<!doctype html>… (here come the 29769 bytes of the requested web page)
ส่วนในตัวอย่างความหมาย
Protocol versionHTTP/1.1
Status code200ผลเป็นตัวเลข
Status messageOKผลเป็นคำ
HeadersContent-Type, Content-Length, …ข้อมูลกำกับ
Bodyเอกสาร HTMLเนื้อหาที่ขอ

ระวัง: บรรทัดแรกของ request คือ method · path · version ส่วนของ response คือ version · status code · status message

Status code

สี่กลุ่ม

กลุ่มความหมายที่พบบ่อย (ตามสไลด์)
2xxSuccess200 OK
3xxRedirection301 Permanent Redirect, 303
4xxApplication Error (ความผิดพลาดฝั่งผู้ขอ)403 Forbidden, 404 Not Found
5xxServer Error500 Server Error

ตารางที่ต้องจำ

Status codeชื่อความหมาย
200OKดึง resource สำเร็จ
201Createdสร้าง resource ใหม่แล้ว
204No Contentสำเร็จ แต่ไม่มีอะไรส่งกลับ
301 / 302Movedย้ายไปที่อื่น (redirect)
400Bad Requestrequest ไม่ถูกต้อง / syntax ผิด
401 / 403Unauthorizedยืนยันตัวตนไม่ผ่าน / ไม่มีสิทธิ์เข้าถึง
404Not Foundขอ resource ที่ไม่มี
409Conflictเกิดความขัดแย้ง เช่น email ซ้ำ
500 / 503Server Errorserver ผิดพลาดภายใน / บริการไม่พร้อมใช้

วิธีจำ: หลักแรกบอก ใครต้องแก้ — 4xx ผู้ขอต้องแก้ request ของตัวเอง · 5xx ต้องแก้ที่ server

Content-Type และ Content-Disposition

header สองตัวนี้บอกว่าจะ ประมวลผล body อย่างไร (ทั้งของ request และ response)

Headerความหมาย
Content-Type: application/jsonbody เป็นข้อมูลแบบ JSON
Content-Type: text/html; charset=utf-8หน้า HTML เข้ารหัสแบบ UTF-8
Content-Type: application/pdf + Content-Disposition: attachment; filename="Financial-Report-2020.pdf"ให้ ดาวน์โหลด เป็นไฟล์ PDF ชื่อนี้

ตัวอย่าง Content-Type

กลุ่มค่า
ข้อความtext/html, text/css, text/javascript, text/csv, text/calendar
ข้อมูลapplication/json, application/xml, application/yaml, application/javascript
รูปimage/jpeg, image/gif, image/png, image/svg+xml
สื่อและฟอนต์video/mp4, font/ttf, font/otf
ฟอร์มmultipart/form-data

รูปแบบคือ ชนิด/ชนิดย่อย (media type) รายการมาตรฐานอยู่ที่ IANA

Stateless

HTTP is stateless: ไม่มีความเชื่อมโยงระหว่าง request สองครั้งที่ทำต่อกันบน connection เดียวกัน

server ไม่จำว่า request ก่อนหน้าเป็นของใคร ทุก request ต้องมีข้อมูลครบในตัวเอง

HTTP is stateless, but not sessionless

ขั้นที่ 1 / 10เริ่มต้น

ขึ้นต้นด้วย http:// หรือ https:// — ลองเปลี่ยน protocol แล้วดู port

IP ของ host นี้
status code ที่ server ตอบ
  1. 1. URL
  2. 2. cache
  3. 3. DNS
  4. 4. TCP
  5. 5. request
  6. 6. response
  7. 7. parse
  8. 8. render
  9. 9. ปิด
Client (browser)
· · ·
Web server
HTTP port 80 · HTTPS port 4432xx สำเร็จ · 3xx redirect · 4xx ฝั่งผู้ขอ · 5xx ฝั่ง server
1.0×

คำอธิบายทีละขั้น

พิมพ์ URL แล้วกด Enter

ระหว่างกด Enter กับหน้าเว็บปรากฏ มีหลายอย่างเกิดขึ้นตามลำดับ: หา IP address, เปิด connection, ส่ง request, รับ response แล้วจึง render กด step เพื่อดูทีละขั้น

เลือก status code ต่าง ๆ ใน simulation เพื่อดู response message ของแต่ละกรณี

ตัวอย่างไล่ทีละขั้น

โจทย์: อ่าน response นี้แล้วตอบ: สำเร็จไหม body เป็นอะไร ยาวเท่าใด

http
HTTP/1.1 404 Not Found
Content-Type: application/json
Content-Length: 28

{"message":"User not found"}
  1. บรรทัดแรก: version HTTP/1.1 · status code 404 · status message Not Found
  2. 404 อยู่กลุ่ม 4xx → ไม่สำเร็จ และเป็นความผิดพลาดฝั่งผู้ขอ (ขอ resource ที่ไม่มี)
  3. Content-Type: application/json → body เป็น JSON ไม่ใช่ HTML
  4. Content-Length: 28 → body ยาว 28 byte
  5. บรรทัดว่างคั่น แล้วจึงเป็น body

response ที่เป็น error ก็มี body ได้ และ client ควรดู status code ก่อนเสมอ ไม่ใช่ดูแค่ว่ามี body กลับมา

จุดที่มักพลาด

1. สลับ port

HTTP 80 · HTTPS 443

2. สลับบรรทัดแรกของ request กับ response

request: method, path, version · response: version, status code, status message

3. สลับกลุ่ม 4xx กับ 5xx

4xx ฝั่งผู้ขอ · 5xx ฝั่ง server

4. คิดว่า 404 แปลว่า server ล่ม

server ทำงานปกติและตอบได้ แค่ไม่มี resource ที่ขอ

5. คิดว่า stateless แปลว่าทำ login ไม่ได้

stateless แต่ไม่ sessionless

6. คิดว่า Content-Type มีเฉพาะใน response

ใช้ทั้งใน request และ response ที่มี body

7. ลืมบรรทัดว่าง

บรรทัดว่างคือเส้นแบ่งระหว่าง headers กับ body

ที่มา: HTTP for Developer.pdf หน้า 9–11, 19–28, 34–36