2009-08-05 31 views
54

Tôi đang gặp khó khăn khi tìm một đặc điểm kỹ thuật xác định trong tiêu chuẩn này. Tôi có một máy khách HTTP không bao gồm tiêu đề 'Content-Length: 0' khi thực hiện yêu cầu PUT nơi tôi không chỉ định một cơ thể và máy chủ bị nhầm lẫn bởi các yêu cầu như vậy, và tôi tự hỏi chương trình nào tôi nên đổ lỗi.Yêu cầu HTTP PUT có cần bao gồm nội dung không?

Trả lời

46

Yêu cầu HTTP có nội dung nếu chúng có tiêu đề Nội dung dài hoặc Chuyển mã hóa (RFC 2616 4.3). Nếu yêu cầu không có, nó không có cơ thể, và máy chủ của bạn nên xử lý nó như vậy.

Điều đó nói rằng không bình thường khi yêu cầu PUT không có cơ thể, và vì vậy nếu tôi thiết kế một khách hàng thực sự muốn gửi một cơ thể trống, tôi sẽ chuyển Content-Length: 0. Thật vậy, tùy thuộc vào đọc các định nghĩa phương thức POST và PUT (RFC 2616 9.5, 9.6) người ta có thể cho rằng cơ thể được ngụ ý là bắt buộc - nhưng cách hợp lý để xử lý không có cơ thể nào là giả định một thân dài bằng không.

2

gì đang được PUT (theo nghĩa động từ) vào máy chủ nếu không có nội dung? Các spec đề cập đến nội dung là "thực thể kèm theo", nhưng một yêu cầu không có nội dung sẽ không có thực thể kèm theo, và do đó không có gì để đưa vào máy chủ.

Trừ khi, tất nhiên, bạn muốn PUT không có gì trên máy chủ, trong trường hợp đó, bạn có thể muốn một DELETE thay thế.

34

Không trả lời các câu hỏi, nhưng khẳng định như thế nào jaxrs cho phép tôi sử dụng thường xuyên đặt bodyless:

Ví dụ về đặt bodyless: Cho người dùng một phép bổ sung.

PUT/admin/người dùng/{username}/phép/{} phép

+1

Chính xác tôi vấn đề! Tôi đến cùng một kết luận. Nhưng nghiêm túc nói, điều này đi ngược lại RFC, ở đâu, mặc dù không được đề cập một cách rõ ràng, cơ thể được gọi là hiện tại. Nó có thể gây ra vấn đề, nhưng theo kinh nghiệm của tôi, tất cả các máy chủ/khung công tác web hiện đại sẽ hoạt động. –

1

Một cơ thể không được yêu cầu của tiêu chuẩn IETF, mặc dù nội dung có độ dài phải là 0 nếu không có cơ thể. Sử dụng phương pháp phù hợp với những gì bạn đang làm. Nếu bạn đặt mã này vào mã, hãy cho

int x; 
int f(){ return x; } 

và biến từ xa có tên r.

Một bài tương đương với

r=f(); 

Một đặt tương đương với

r=x; 

và get tương đương với

x=r; 
+0

Đây là ví dụ rõ ràng nhất về PUT so với POST mà tôi từng đọc, mặc dù nằm ngoài chủ đề –

Các vấn đề liên quan