Giao thức HTTP và việc tương tác giữa trình duyệt và máy chủ web
HTTP là giao thức (protocol) giúp trình duyệt (client) tương tác với máy chủ web (server). Khi truy cập một trang web, bạn đang gửi một yêu cầu HTTP đến máy chủ web. Yêu cầu HTTP này bao gồm Phần đầu và Thân của yêu cầu.
Các cổng mặc định cho các giao thức HTTP trên các trang web hiện nay là:
- HTTP: 80
- HTTPS: 443
Phần đầu của yêu cầu HTTP
Phần đầu của yêu cầu HTTP (như một tin nhắn) bao gồm ba phần sau:
- Phiên bản giao thức: HTTP/1.1
- Phương thức HTTP như GET, POST, PUT, HEAD, OPTION, DELETE
- Đường dẫn của yêu cầu: thường là một URL và định dạng của nó phụ thuộc vào phương thức HTTP. Ví dụ:
-
Sử dụng đường dẫn tuyệt đối, phổ biến và thường được sử dụng với GET, POST, HEAD, OPTIONS:
POST / HTTP/1.1 GET /background.png HTTP/1.0 HEAD /test.html?query=alibaba HTTP/1.1 OPTIONS /anypage.html HTTP/1.0
-
Sử dụng đường dẫn hoàn chỉnh khi cần kết nối với proxy thông qua phương thức GET:
GET https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
-
Chỉ sử dụng dạng authority khi cần thiết lập HTTP tunnel (tên miền: cổng) bằng phương thức CONNECT:
CONNECT developer.mozilla.org:80 HTTP/1.1
-
Sử dụng dấu '*' khi muốn đường dẫn đại diện cho toàn bộ máy chủ thông qua phương thức OPTIONS:
OPTIONS * HTTP/1.1
Phần đầu chứa thông tin của yêu cầu và định dạng key:value
Phần đầu của yêu cầu chứa các thông tin với định dạng key : value.
Header của yêu cầu được chia thành vài nhóm chính:
- General header: áp dụng cho toàn bộ tin nhắn
- Response header: chỉ định thêm cho yêu cầu thông qua việc thay đổi một số tham số
- Representation headers: như Content-Type để mô tả định dạng dữ liệu được gửi lên máy chủ và cho biết liệu dữ liệu đó có áp dụng mã hóa nào không (chỉ có khi yêu cầu có Thân)
Có thể tùy chỉnh giá trị cho các key trong Header
Trong phương thức POST, bạn có thể tùy chỉnh theo mẫu sau:
class strest(tornado.web.RequestHandler):
def set_default_headers(self):
self.set_header("Content-Type", 'application/json')
def post(self):
value = self.get_argument('key')
cbtp = cbt.main(value)
r = json.dumps({'cbtp': cbtp})
self.write(r)
Bạn có thể tham khảo các key thông tin trong Header tại: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
Phần Thân
Không phải phương thức nào cũng cần có Thân. Các phương thức như GET, HEAD, DELETE, OPTIONS ít khi cần. Thông thường, khi cần gửi thông tin cập nhật nào đó lên máy chủ thì phương thức POST được sử dụng (chứa dữ liệu của biểu mẫu HTML).
Phần Thân gồm hai loại:
- Thân với một tài nguyên duy nhất: chứa một loại tệp duy nhất, được xác định bởi Content-Type và Content-Length (trong tiêu đề).
- Thân với nhiều tài nguyên: chứa dữ liệu nhiều phần, mỗi phần chứa các thông tin khác nhau. Các phần này được phân tách bằng dấu - trong tiêu đề phần Content-Type. Loại này thường được sử dụng với biểu mẫu HTML.
Content-Type: multipart/form-data; boundary=aBoundaryString (những tiêu đề khác liên quan đến tài liệu nhiều phần như là một thể)
-aBoundaryString Content-Disposition: form-data; name="myFile"; filename="img.jpg" Content-Type: image/jpeg (dữ liệu)
-aBoundaryString Content-Disposition: form-data; name="myField" (dữ liệu)
-aBoundaryString (những phần khác)
-aBoundaryString-
Phương thức HTTP
GET
Dữ liệu yêu cầu sẽ hiển thị trên URL nên không an toàn. Phương thức này phù hợp khi cần tải xuống dữ liệu vì nó truy cập nhanh khi dữ liệu không hoặc ít thay đổi.
Dữ liệu của phương thức này được gửi khi yêu cầu hiển thị trên thanh địa chỉ (URL) của trình duyệt.
/test/demo_form.php?user=itplus&password=admin
Đặc điểm:
- HTTP GET có thể được lưu vào bộ nhớ cache của trình duyệt.
- HTTP GET có thể được duy trì trong lịch sử, cho phép người dùng đánh dấu trang web.
- HTTP GET không được sử dụng nếu yêu cầu chứa dữ liệu nhạy cảm như mật khẩu, tài khoản ngân hàng.
- HTTP GET có giới hạn về độ dài của dữ liệu được gửi.
POST
Dữ liệu gửi đi (trong yêu cầu) sẽ không hiển thị trên thanh địa chỉ URL vì đã được mã hóa, do đó có độ bảo mật cao.
Đặc điểm:
- HTTP POST không được lưu vào bộ nhớ cache của trình duyệt.
- HTTP POST không thể duy trì trong lịch sử, do đó không thể đánh dấu trang web.
- HTTP POST không giới hạn độ dài của dữ liệu gửi đi.
Sự khác biệt giữa POST và GET
Điểm chung: Cả hai phương thức đều được sử dụng để trao đổi dữ liệu giữa máy khách và máy chủ.
Điểm khác biệt:
- POST: Bảo mật hơn GET vì dữ liệu chỉ được gửi đi mà không hiển thị trên URL.
- GET: Dữ liệu được gửi đi một cách rõ ràng, có thể nhìn thấy trên URL, do đó không an toàn hơn POST.
- GET thực thi nhanh hơn POST vì dữ liệu gửi đi luôn được lưu vào bộ nhớ cache của trình duyệt.
- Khi sử dụng phương thức POST, máy chủ luôn thực thi và trả về kết quả cho máy khách, trong khi phương thức GET, trình duyệt sẽ xem trong bộ nhớ cache có kết quả tương ứng với yêu cầu hay không và trả về ngay mà không cần thực thi yêu cầu ở phía máy chủ.
- Đối với dữ liệu thay đổi liên tục, nên sử dụng phương thức POST; còn đối với dữ liệu ít thay đổi, nên sử dụng phương thức GET để truy xuất và xử lý nhanh hơn.
HEAD
Trả về phản hồi là phần đầu của yêu cầu.
Phản hồi HTTP
Dòng đầu tiên của phần phản hồi chứa ba thông tin:
- Phiên bản giao thức
- Mã trạng thái: mã trạng thái trả về để biết yêu cầu thành công hay thất bại
- Văn bản trạng thái: văn bản giải thích cho mã trạng thái
Header của phản hồi được chia thành vài nhóm chính:
- General header: áp dụng cho toàn bộ tin nhắn
- Response header: chỉ định thêm cho yêu cầu thông qua việc thay đổi một số tham số.
- Representation headers: như Content-Type để mô tả định dạng dữ liệu trong phản hồi và cho biết liệu dữ liệu có áp dụng mã hóa nào không (chỉ có khi yêu cầu có Thân)
Phần Thân
Không phải phản hồi nào cũng có thân, khi phản hồi đã đáp ứng đủ yêu cầu mà không cần có nội dung bổ sung. Ví dụ như các mã trạng thái như 201 Created hoặc 204 No Content.
Phần Thân phản hồi có thể chia thành ba loại:
- Thân với một tài nguyên duy nhất: chứa một loại tệp duy nhất, được xác định bởi Content-Type và Content-Length (trong tiêu đề).
- Thân với một tài nguyên duy nhất: chứa một loại tệp duy nhất, không biết độ dài, được mã hóa bằng các khối với khóa Transfer-Encoding : chunked.
- Thân với nhiều tài nguyên: chứa các phần nhiều phần, mỗi phần chứa các thông tin khác nhau. Loại này ít gặp.
Địa chỉ HTTP
Phần này liên quan đến việc chuyển hướng.
Tham khảo thêm: