Bài 17: Gửi các request và xử lý response Giao thức HTTP Trước hết chúng ta cùng tìm hiểu hoạt đông của giao thức HTTP truyền thống - Hypertext Transfer Protocol, xem xét các bản tin –
Trang 1Bài 17: Gửi các request và xử lý response
Giao thức HTTP
Trước hết chúng ta cùng tìm hiểu hoạt đông của giao thức HTTP truyền thống - Hypertext
Transfer Protocol, xem xét các bản tin – message của giao thức này Thay vì quan tâm đến các
bit hay byte, chúng ta để ý đến các từ ngữ (thông báo) được xác định trong đặc tả HTTP và các
quy tắc kết hợp chúng lại với nhau
Một HTTP message bắt đầu với một dòng request hay status, tiếp theo có thể là nhiều loại
headers và phần message body
Cấu trúc của HTTP Message
HTTP là một giao thức kiểu client/server; client đưa ra các request, và server sẽ trả lời các
request này Cấu trúc các HTTP message vì thế cũng thay đổi theo yếu tố này Có một định dạng
cho HTTP request và cho các response
HTTP Request
Mỗi request bắt đầu với một Request-Line Dòng này chỉ ra phương thức mà client yêu cầu, tài
nguyên, và phiên bản của HTTP mà client có thể hỗ trợ Request-Line có thể có tiếp sau một hay
nhiều header và một message body
Một HTTP request bắt đầu với một Request-Line và có thể bao gồm các header và message
body Phần header có thể mô tả quá việc truyền dữ liệu, xác định các yêu cầu hay phần message
body kèm theo
Trích:
GET / HTTP/1.1
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
(compatible; MSIE 5.5; Windows NT 5.0)
Host: www.ft.com
Trang 2Connection: Keep-Alive
Request-Line chứa ba mục phân biệt, đó là method, uri, và phiên bản HTTP, mỗi mục được phân
tách bởi một hay nhiều khoảng trống
Một HTTP Request-Line có một phương thức, một địa chỉ định danh tài nguyên (URI), và thông
báo phiên bản HTTP
Phương thức được xác định trên dòng đầu tiên của Request-Line HTTP định nghĩa tất cả là 8
phương thức Một HTTP server chỉ được yêu cầu hỗ trợ các phương thức GET và HEAD; nếu
chúng hỗ trợ các phương thức HTTP khác, sự hỗ trợ đó phải được gắn với các quy tắc của
HTTP Đặc tả HTTP cũng có các mở rộng để các phương thức khác có thể được bổ sung trong
tương lai
Bảng HTTP Method (Xem file attach bài này)
Mục tiếp theo trong Request-Line là Request-uri Mục này cung cấp địa chỉ định danh tài nguyên
cho một tài nguyên Ví dụ, Request-uri là /, chỉ ra một request cho tài nguyên gốc Cho các
request không yêu cầu một tài nguyên cụ thể (như là TRACE request hay trong một số trường
hợp cả OPTIONS request), client có thể dùng một dấu * cho Request-uri
Mục cuối cùng trong Request-Line là phiên bản HTTP Như trong ví dụ, phiên bản HTTP là 1.1
chứa trong đoạn text HTTP/1.1
Tiếp sau Request-Line, một HTTP request có thể bao gồm một hay nhiều dòng message header
Một message header có thể chứa các loại general header, request header, hoặc entity header
General header áp dụng trong truyền dữ liệu; request header áp dụng cho các request cụ thể, và
entity header áp dụng cho message body trong request
Một HTTP request luôn chứa một dòng trống sau Request-Line và bất kỳ header nào Nếu
request bao gồm một message body, phần body đi sau một dòng trống Dòng trống - blank line
Trang 3rất quan trọng vì server xác định được phần kết của request, hoặc phần kết của header Không có
dòng trống, server nhận các message sẽ không biết được các header khác nữa có tiếp tục được
truyền không
Bài 18
HTTP Response
HTTP Response khá giống với HTTP Request Dấu hiệu khác biệt duy nhất là response bắt đầu
với một dòng trạng thái status so với Request-Line Status-Line, cũng giống như Request-Line,
chứa ba mục ngăn cách bởi các khoảng trống
Một HTTP response bắt đầu với một Status-Line và có thể chứa các header và một message
body Header có thể mô tả quá trình truyền dữ liệu, xác định response, hoặc phần body kèm theo
Dòng bắt đầu với phiên bản cao nhất của HTTP mà server hỗ trợ
Trích:
HTTP/1.1 200 OK
Date: Sun, 08 Oct 2000 18 12 GMT
Server: Apache/1.3.6 (Unix)
Keep-Alive: timeout=5, max=120
Connection: Keep-Alive
Content-Type: text/html<html>…
HTTP Status-Line bắt đầu với chỉ báo HTTP, mã trạng thái, và một đoạn text mô tả response
Hai mục còn lại trong Status-Line là Status-Code và Reason-Phrase Status-Code là một bộ ba kí
tự chỉ báo kết quả của request Status-Code phổ biến nhất là 200 Giá trị này thông báo yêu cầu
của client thành công
Phân loại HTTP Status Code: (Xem file attach)
Header Field
HTTP request và response có thể có một hay nhiều message header Message header bắt đầu với
tên trường và dấu (“:”) Trong một số trường hợp, chỉ có tên trường trong phần header Trong
hầu hết các trường hợp khác header chứa các thêm thông tin khác nữa, các thông tin này đi sau
Trang 4một dòng thì dòng tiếp theo sẽ bắt đầu với một hay nhiều kí tự trống hay kí tự gạch ngang (ascii
character 8) Ví dụ sau là của User-Agent header:
Trích:
GET / HTTP/1.1
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
(compatible; MSIE 5.5; Windows NT 5.0)
Host: www.ft.com
Connection: Keep-Alive
Nếu một message header chứa một chuỗi giá trị phân tách bởi dấu “,”; ta có thể tách ra thành các
dòng riêng, như ví dụ sau tách các giá trị của Accept-Encoding:
Trích:
GET / HTTP/1.1
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip
Accept-Encoding: deflate
User-Agent: Mozilla/4.0
(compatible; MSIE 5.5; Windows NT 5.0)
Host: www.ft.com
Connection: Keep-Alive
Bảng sau thể hiện các HeaderField, phạm vi áp dụng của chúng trong các request hay response,
hay trong message body (entity) đi kèm với request hay response