Câu trả lời ngắn: trong các yêu cầu POST, các giá trị được gửi trong "phần thân" của yêu cầu. Với các biểu mẫu web, rất có thể chúng được gửi với loại phương tiện application/x-www-form-urlencoded
hoặc multipart/form-data
. Ngôn ngữ lập trình hoặc các khuôn khổ đã được thiết kế để xử lý web yêu cầu thường làm "The Right Thing ™" với yêu cầu đó và cung cấp cho bạn dễ dàng truy cập vào các giá trị dễ dàng giải mã (như $_REQUEST
hay $_POST
trong PHP, hoặc cgi.FieldStorage()
, flask.request.form
trong Python).
Bây giờ hãy lạc đề một chút, điều này có thể giúp hiểu được sự khác biệt;)
Sự khác biệt giữa GET
và POST
yêu cầu phần lớn là ngữ nghĩa. Chúng cũng được "sử dụng" khác nhau, điều này giải thích sự khác biệt trong cách các giá trị được thông qua.
Khi thực hiện một GET
yêu cầu, bạn yêu cầu máy chủ cho một hoặc một tập hợp các thực thể. Để cho phép khách hàng lọc kết quả, nó có thể sử dụng cái gọi là "chuỗi truy vấn" của URL. Chuỗi truy vấn là phần sau ?
. Đây là một phần của cú pháp URI .
Vì vậy, từ quan điểm của mã ứng dụng của bạn (phần nhận được yêu cầu), bạn sẽ cần kiểm tra phần truy vấn URI để có quyền truy cập vào các giá trị này.
Lưu ý rằng các khóa và giá trị là một phần của URI. Các trình duyệt có thể áp đặt giới hạn về độ dài URI. Tiêu chuẩn HTTP tuyên bố rằng không có giới hạn. Nhưng tại thời điểm viết bài này, hầu hết các trình duyệt đều giới hạn các URI (tôi không có giá trị cụ thể). GET
yêu cầu không bao giờ được sử dụng để gửi thông tin mới đến máy chủ. Đặc biệt không phải tài liệu lớn hơn. Đó là nơi bạn nên sử dụng POST
hoặc PUT
.
Khi thực hiện một POST
yêu cầu, khách hàng thực sự đang gửi một tài liệu mới đến máy chủ từ xa. Vì vậy, một chuỗi truy vấn không có ý nghĩa (về mặt ngữ nghĩa). Đó là lý do tại sao bạn không có quyền truy cập vào chúng trong mã ứng dụng của mình.
POST
phức tạp hơn một chút (và cách linh hoạt hơn):
Khi nhận được yêu cầu POST, bạn phải luôn mong đợi "tải trọng" hoặc, theo thuật ngữ HTTP: nội dung thư . Bản thân phần thân thông điệp khá vô dụng, vì không có định dạng chuẩn (theo như tôi có thể nói. Có lẽ định dạng ứng dụng / octet-stream?). Định dạng cơ thể được xác định bởi Content-Type
tiêu đề. Khi sử dụng một FORM
phần tử HTML với method="POST"
, điều này thường là application/x-www-form-urlencoded
. Một loại rất phổ biến khác là nhiều dữ liệu / biểu mẫu dữ liệu nếu bạn sử dụng tải lên tệp. Nhưng nó có thể là bất cứ thứ gì , từ text/plain
, hơn application/json
hoặc thậm chí là một tùy chỉnh application/octet-stream
.
Trong mọi trường hợp, nếu một POST
yêu cầu được đưa ra với một yêu cầu Content-Type
không thể được xử lý bởi ứng dụng, thì nó sẽ trả về một 415
mã trạng thái .
Hầu hết các ngôn ngữ lập trình (và / hoặc khung web) cung cấp một cách để khử / mã hóa nội dung thư từ / sang các loại phổ biến nhất (như application/x-www-form-urlencoded
, multipart/form-data
hoặc application/json
). Thật dễ dàng. Các loại tùy chỉnh yêu cầu tiềm năng công việc nhiều hơn một chút.
Sử dụng một tài liệu mã hóa biểu mẫu HTML tiêu chuẩn làm ví dụ, ứng dụng sẽ thực hiện các bước sau:
- Đọc
Content-Type
trường
- Nếu giá trị không phải là một trong các loại phương tiện được hỗ trợ, thì trả về phản hồi bằng
415
mã trạng thái
- mặt khác, giải mã các giá trị từ phần thân thông điệp.
Một lần nữa, các ngôn ngữ như PHP hoặc khung web cho các ngôn ngữ phổ biến khác có thể sẽ xử lý việc này cho bạn. Ngoại lệ cho điều này là 415
lỗi. Không khung nào có thể dự đoán loại nội dung nào mà ứng dụng của bạn chọn để hỗ trợ và / hoặc không hỗ trợ. Đây là tùy thuộc vào bạn.
Một PUT
yêu cầu được xử lý khá nhiều theo cách chính xác giống như một POST
yêu cầu. Sự khác biệt lớn là một POST
yêu cầu được cho là để cho máy chủ quyết định cách (và nếu có) tạo ra một tài nguyên mới. Trong lịch sử (từ RFC2616 đã lỗi thời, nó đã tạo ra một tài nguyên mới dưới dạng "cấp dưới" (con) của URI nơi yêu cầu được gửi đến).
PUT
Ngược lại, một yêu cầu được cho là "ký gửi" một tài nguyên chính xác tại URI đó và với chính xác nội dung đó. Không nhiều không ít. Ý tưởng là khách hàng có trách nhiệm tạo ra tài nguyên hoàn chỉnh trước khi "PUTting" nó. Máy chủ nên chấp nhận nó như trên URL đã cho.
Kết quả là, một POST
yêu cầu thường không được sử dụng để thay thế một tài nguyên hiện có. Một PUT
yêu cầu có thể làm cả tạo và thay thế.
Lưu ý phụ
Ngoài ra còn có " tham số đường dẫn " có thể được sử dụng để gửi dữ liệu bổ sung đến điều khiển từ xa, nhưng chúng không phổ biến đến mức tôi sẽ không đi sâu vào chi tiết ở đây. Nhưng, để tham khảo, đây là một đoạn trích từ RFC:
Ngoài các phân đoạn dấu chấm trong các đường dẫn phân cấp, một phân đoạn đường dẫn được coi là mờ theo cú pháp chung. Các ứng dụng sản xuất URI thường sử dụng các ký tự dành riêng được cho phép trong một phân đoạn để phân định các thành phần con cụ thể theo sơ đồ hoặc trình xử lý cụ thể. Ví dụ: các ký tự dành riêng cho dấu chấm phẩy (";") và bằng ("=") thường được sử dụng để phân định các tham số và giá trị tham số áp dụng cho phân đoạn đó. Ký tự dành riêng dấu phẩy (",") thường được sử dụng cho các mục đích tương tự. Ví dụ: một nhà sản xuất URI có thể sử dụng một phân đoạn như "name; v = 1.1" để chỉ ra một tham chiếu đến phiên bản 1.1 của "name", trong khi một nhà sản xuất khác có thể sử dụng một phân đoạn như "name, 1.1" để chỉ ra điều tương tự. Các loại tham số có thể được xác định bởi ngữ nghĩa cụ thể của lược đồ,
multipart/form-data
. Đối với những người quan tâm, đây là một câu hỏi về nó .