ฉันมีปัญหาในการค้นหาข้อกำหนดที่แน่นอนของสิ่งนี้ในมาตรฐาน ฉันมีไคลเอนต์ HTTP ที่ไม่รวมContent-Length: 0ส่วนหัวเมื่อทำการร้องขอ PUT โดยที่ฉันไม่ได้ระบุเนื้อความและเซิร์ฟเวอร์ที่ทำให้คำขอดังกล่าวสับสนและฉันสงสัยว่าฉันควรโทษโปรแกรมใด
ฉันมีปัญหาในการค้นหาข้อกำหนดที่แน่นอนของสิ่งนี้ในมาตรฐาน ฉันมีไคลเอนต์ HTTP ที่ไม่รวมContent-Length: 0ส่วนหัวเมื่อทำการร้องขอ PUT โดยที่ฉันไม่ได้ระบุเนื้อความและเซิร์ฟเวอร์ที่ทำให้คำขอดังกล่าวสับสนและฉันสงสัยว่าฉันควรโทษโปรแกรมใด
คำตอบ:
คำขอ HTTP มีเนื้อหาหากมีส่วนหัว Content-Length หรือ Transfer-Encoding ( RFC 2616 4.3 ) หากคำขอไม่มีแสดงว่าไม่มีเนื้อหาและเซิร์ฟเวอร์ของคุณควรปฏิบัติตามคำขอดังกล่าว
นั่นบอกว่าเป็นเรื่องผิดปกติที่คำขอ PUT จะไม่มีเนื้อความดังนั้นหากฉันกำลังออกแบบไคลเอนต์ที่ต้องการส่งเนื้อหาเปล่าจริงๆฉันจะส่ง Content-Length: 0 อันที่จริงขึ้นอยู่กับการอ่าน POST ของคน ๆ หนึ่ง และคำจำกัดความของวิธีการ PUT ( RFC 2616 9.5, 9.6 ) อาจมีคนโต้แย้งว่าจำเป็นต้องใช้เนื้อหาโดยนัย - แต่วิธีที่เหมาะสมในการจัดการกับร่างกายจะไม่ถือว่าร่างกายมีความยาวเป็นศูนย์
PUTคำขอเป็นพื้นฐานสำหรับการสร้างหรืออัปเดตไฟล์บนเซิร์ฟเวอร์ และไม่มีอะไรผิดกฎหมายเกี่ยวกับไฟล์ที่ว่างเปล่าใช่หรือไม่?
disableและenableเป็นคำกริยา ฉันอาจต้องการใช้PATCHกับ/users/{id}จุดสิ้นสุดในกรณีนั้น
ไม่ตอบคำถาม แต่ยืนยันว่า jaxrs ช่วยให้ฉันใช้ PUT แบบไม่ใช้ร่างกายได้บ่อยแค่ไหน:
ตัวอย่างการใส่แบบไม่มีร่างกาย: ให้สิทธิ์เพิ่มเติมแก่ผู้ใช้
PUT / admin / users / {username} / permission / {permission}
มาตรฐาน IETF ไม่จำเป็นต้องมีเนื้อหาแม้ว่าความยาวของเนื้อหาควรเป็น 0 หากไม่มีเนื้อหา ใช้วิธีการที่เหมาะสมกับสิ่งที่คุณทำ ถ้าคุณจะใส่ลงในรหัสให้
int x;
int f(){ return x; }
rและตัวแปรระยะไกลที่เรียกว่า
โพสต์เทียบเท่ากับ
r=f();
การใส่เทียบเท่ากับ
r=x;
และได้รับเทียบเท่ากับ
x=r;
int f(int* resource, int body);แล้ว POST จะเรียกใช้f(&r, x);- ซึ่งอาจทำหรือไม่ทำrอะไรก็ได้ที่เซิร์ฟเวอร์คิดว่าเหมาะสม แต่ก็ยังสามารถกลับสิ่งดังนั้น ... y = f(&r, x);อาจจะมากขึ้นเช่น
อะไรคือการ PUT (ในความหมายของคำกริยา) บนเซิร์ฟเวอร์หากไม่มีเนื้อหา ข้อมูลจำเพาะหมายถึงเนื้อหาเป็น "นิติบุคคลที่ล้อมรอบ" แต่คำขอที่ไม่มีเนื้อหาจะไม่มีการปิดล้อมนิติบุคคลและดังนั้นจึงไม่มีอะไรที่จะวางบนเซิร์ฟเวอร์
เว้นแต่ว่าคุณไม่ต้องการใส่อะไรลงในเซิร์ฟเวอร์ซึ่งในกรณีนี้คุณอาจต้องการ DELETE แทน
Content-Length: 0หรือ{ }ใน JSON เป็นร่างกาย?
ฟิลด์ความยาวเนื้อหาจำเป็นตามส่วนต่อไปนี้ในมาตรฐาน HTTP / 1.1 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13