Tôi có cần một tiêu đề loại nội dung cho các yêu cầu HTTP GET không?


154

Theo tôi hiểu, có hai nơi để đặt loại nội dung:

  1. Máy khách đặt loại nội dung cho phần thân mà anh ta đang gửi đến máy chủ (ví dụ: đối với bài đăng)
  2. Máy chủ đặt loại nội dung cho phản hồi.

Điều này có nghĩa là tôi không phải hoặc không nên đặt loại nội dung cho tất cả các yêu cầu nhận của tôi (phía khách hàng). Và nếu tôi có thể hoặc nên loại nội dung đó sẽ là gì?

Ngoài ra tôi đọc trong một vài bài viết rằng loại nội dung của khách hàng chỉ định loại nội dung mà khách hàng muốn nhận. Vì vậy, có lẽ điểm 1 của tôi là không đúng?

Câu trả lời:


112

Theo RFC 7231, phần 3.1.5.5 :

Người gửi tạo thông báo chứa phần thân tải trọng NÊN tạo trường tiêu đề Kiểu nội dung trong thông báo đó trừ khi loại phương tiện dự định của đại diện kèm theo không xác định đối với người gửi. Nếu không có trường tiêu đề Kiểu nội dung, người nhận có thể giả sử loại phương tiện "ứng dụng / octet-stream" ( [RFC2046], Mục 4.5.1 ) hoặc kiểm tra dữ liệu để xác định loại.

Điều đó có nghĩa là Content-Typetiêu đề HTTP chỉ nên được đặt cho PUTPOSTyêu cầu.


5
@Epoc, Tin nhắn được trích dẫn là tốt nhất ẩn. Nó không thực sự nói rằng các tin nhắn không có thực thể SHOULD NOTbao gồm Kiểu nội dung. Chúng ta có một trích dẫn rõ ràng?
Pacerier

1
@Pacerier vui lòng không đưa ra kết luận cốt lõi về câu trả lời của người khác, ngay cả khi đó là sai. Tôi đồng ý rằng câu trả lời của Epoc là sai - không có gì trong phần anh ấy trích dẫn ủng hộ kết luận câu trả lời của anh ấy, và nó xứng đáng bị đánh giá thấp. Nhưng điều đó không có nghĩa là bạn nên chỉnh sửa câu trả lời để loại bỏ tiền đề cốt lõi của nó và do đó thay đổi hoàn toàn ý nghĩa của nó.
Đánh dấu Amery

8
Tôi nghĩ rằng các bạn đang đọc những từ của @ Epoc theo đúng nghĩa đen. Chắc chắn, phần trích dẫn không có nghĩa là những gì ông nói nó có nghĩa. Nhưng tôi nghĩ rằng kết luận là chính xác trong bối cảnh của câu hỏi OP. OP đang tìm kiếm sự rõ ràng khi nó có ý nghĩa bao gồm Kiểu nội dung và khi nào thì không. Epoc đã cung cấp thông tin về cách sử dụng tiêu đề và đưa ra kết luận rằng bất kỳ nhà phát triển hợp lý nào cũng sẽ: bạn "nên" sử dụng loại nội dung cho các yêu cầu có cơ quan tải trọng (chủ yếu là PUT và POST) và bạn có thể "không nên" sử dụng nó ở những nơi không hữu ích, như GET hoặc HEAD, v.v.
JVMATL

1
Bài viết của bạn, "Nó có nghĩa là .." - là một sự kéo dài.
Adrian Bartholomew

64

Nhận yêu cầu không nên có loại nội dung vì chúng không có thực thể yêu cầu (nghĩa là phần thân)


31
@Dmitry, Cần trích dẫn , nếu không, nó là một giả định, không phải là một thực tế.
Pacerier

6
Mặc dù tôi đồng ý rằng thông số kỹ thuật không nói rằng bạn không thể có Kiểu nội dung trên GET, .Net dường như thực thi nó trong HTTPClient. Xem stackoverflow.com/questions/10679214/ cấp
Adam


27

Câu trả lời được chấp nhận là sai. Trích dẫn là chính xác, khẳng định rằng PUT và POST phải có nó là không chính xác. Không có yêu cầu rằng PUT hoặc POST thực sự có nội dung bổ sung. Cũng không có lệnh cấm đối với GET thực sự có nội dung.

Các RFC nói chính xác ý nghĩa của chúng .. IFF phía bạn (máy khách gốc OR) sẽ gửi nội dung bổ sung, ngoài các tiêu đề HTTP, nó NÊN chỉ định tiêu đề Kiểu nội dung. Nhưng lưu ý rằng có thể bỏ qua Loại nội dung và vẫn bao gồm nội dung (giả sử bằng cách sử dụng tiêu đề Độ dài nội dung).


0

Câu trả lời ngắn: Rất có thể, không, bạn không cần tiêu đề loại nội dung cho các yêu cầu HTTP GET. Nhưng thông số kỹ thuật dường như cũng không loại trừ tiêu đề kiểu nội dung cho HTTP GET.

Vật liệu hỗ trợ:

  1. "Kiểu nội dung" là một phần của siêu dữ liệu đại diện (tức là tải trọng). Trích dẫn từ RFC 7231 phần 3.1 :

    3.1. Đại diện siêu dữ liệu

    Các trường tiêu đề đại diện cung cấp siêu dữ liệu về đại diện. Khi một thông báo bao gồm phần thân tải trọng, các trường tiêu đề đại diện mô tả cách diễn giải dữ liệu đại diện được đính kèm trong phần thân tải trọng. ...

    Các trường tiêu đề sau đây truyền tải siêu dữ liệu đại diện:

    +-------------------+-----------------+
    | Header Field Name | Defined in...   |
    +-------------------+-----------------+
    | Content-Type      | Section 3.1.1.5 |
    | ...               | ...             |
    

    Trích dẫn từ RFC 7231 phần 3.1.1.5 (nhân tiện, câu trả lời được chọn hiện tại có một lỗi đánh máy trong số phần):

    Trường tiêu đề "Loại nội dung" cho biết loại phương tiện của đại diện được liên kết

  2. Theo nghĩa đó, một Content-Typetiêu đề không thực sự là về yêu cầu HTTP GET (hoặc yêu cầu POST hoặc PUT, cho vấn đề đó). Đó là về tải trọng bên trong một yêu cầu bất cứ điều gì . Vì vậy, nếu không có tải trọng, thì không cần Content-Type. Trong thực tế, một số thực hiện đã đi trước và đưa ra giả định dễ hiểu. Trích dẫn từ bình luận của Adam :

    "Trong khi ... thông số kỹ thuật không nói rằng bạn không thể có Kiểu nội dung trên GET, .Net dường như thực thi nó trong HTTPClient. Hãy xem SO q & a này ."

  3. Tuy nhiên, nói đúng ra, bản thân thông số kỹ thuật không loại trừ khả năng HTTP GET chứa tải trọng. Trích dẫn từ RFC 7231 phần 4.3.1 :

    4.3.1 NHẬN

    ...

    Một tải trọng trong một thông báo yêu cầu GET không có ngữ nghĩa được xác định; gửi một cơ quan tải trọng theo yêu cầu GET có thể khiến một số triển khai hiện có từ chối yêu cầu.

    Vì vậy, nếu HTTP GET của bạn xảy ra bao gồm tải trọng vì bất kỳ lý do gì, thì Content-Typetiêu đề cũng có thể hợp lý.


-2

Vấn đề với việc không chuyển loại nội dung trên tin nhắn GET là chắc chắn loại nội dung không liên quan vì phía máy chủ xác định nội dung nào. Vấn đề mà tôi gặp phải là hiện tại có rất nhiều nơi thiết lập dịch vụ web của họ đủ thông minh để chọn loại nội dung mà bạn vượt qua và trả lời phản hồi trong 'loại' mà bạn yêu cầu. Ví dụ. chúng tôi hiện đang nhắn tin với một nơi mặc định là JSON, tuy nhiên, họ đã thiết lập dịch vụ web của họ để nếu bạn vượt qua loại xml nội dung thì họ sẽ trả về xml thay vì mặc định JSON của họ. Mà tôi nghĩ đi về phía trước là một ý tưởng tuyệt vời

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.