HTTP GET พร้อมเนื้อหาคำขอ


2110

ฉันกำลังพัฒนา webservice RESTful ใหม่สำหรับแอปพลิเคชันของเรา

เมื่อทำการ GET กับบางเอนทิตีลูกค้าสามารถร้องขอเนื้อหาของเอนทิตี หากพวกเขาต้องการเพิ่มพารามิเตอร์บางอย่าง (ตัวอย่างเช่นการเรียงลำดับรายการ) พวกเขาสามารถเพิ่มพารามิเตอร์เหล่านี้ในสตริงแบบสอบถาม

อีกทางหนึ่งฉันต้องการให้ผู้คนสามารถระบุพารามิเตอร์เหล่านี้ในเนื้อหาคำขอ HTTP / 1.1ดูเหมือนจะไม่ได้รับการอนุญาตนี้อย่างชัดเจน สิ่งนี้จะช่วยให้พวกเขาระบุข้อมูลเพิ่มเติมอาจทำให้ง่ายขึ้นในการระบุคำขอ XML ที่ซับซ้อน

คำถามของฉัน:

  • นี่เป็นความคิดที่ดีหรือไม่?
  • ไคลเอนต์ HTTP จะมีปัญหากับการใช้เนื้อความคำขอภายในคำขอ GET หรือไม่

http://tools.ietf.org/html/rfc2616


552
ข้อดีคือช่วยให้สามารถส่งคำขอร้องขอ XML หรือ JSON ได้อย่างง่ายดายไม่มีข้อจำกัดความยาวและเข้ารหัสได้ง่ายขึ้น (UTF-8)
หลีกเลี่ยง

29
หากสิ่งที่คุณทำหลังจากนั้นเป็นวิธีที่ปลอดภัยและเป็น idempotent ที่อนุญาตให้เนื้อหาร้องขอคุณอาจต้องการดู SEARCH PROPFIND และรายงาน แน่นอนว่าไม่ได้ใช้ GET และการขอร่างกายเอาชนะแคชไม่มากก็น้อย
Julian Reschke

226
@fijiaaron: 3 ปีต่อมาและหลังจากนั้นฉันก็ได้รับประสบการณ์การเขียนเว็บเซอร์ มันเป็นสิ่งที่ฉันทำในช่วงไม่กี่ปีที่ผ่านมา ฉันสามารถพูดได้อย่างปลอดภัยจริง ๆ แล้วมันเป็นความคิดที่ดีมากที่จะเพิ่มเนื้อหาในคำขอ GET คำตอบสองอันดับแรกยืนเหมือนหิน
ปลิ้น

26
@Ellesedil: ใส่เพียง: ไม่ว่าจะมีข้อได้เปรียบอะไรบ้างในการใช้ GET ผ่าน POST เนื่องจากมีการออกแบบ HTTP ข้อดีเหล่านั้นไม่มีอยู่อีกต่อไปเมื่อคุณละเมิดมาตรฐานด้วยวิธีนี้ ดังนั้นมีเพียงเหตุผลเดียวที่เหลือให้ใช้ GET + เนื้อหาคำขอแทน POST: สุนทรียศาสตร์ อย่าเสียสละการออกแบบที่แข็งแกร่งเหนือความสวยงาม
หลีกเลี่ยง

7
เพื่อขีดเส้นใต้สิ่งที่ Evert พูดว่า: "มันไม่มีการจำกัดความยาว" หาก GET ของคุณที่มีพารามิเตอร์การสืบค้นกำลังแบ่งข้อจำกัดความยาว (ของ 2048) ดังนั้นตัวเลือกอื่นจะมีอะไรนอกจากการใส่ข้อมูลสตริงการสืบค้นในวัตถุ json ตัวอย่างเช่นในเนื้อความของคำขอ
Kieran Ryan

คำตอบ:


1724

ความคิดเห็นรอยฟีลดิงเกี่ยวกับร่างกายรวมทั้งที่มีการร้องขอการ GET

ใช่. กล่าวอีกนัยหนึ่งข้อความคำขอ HTTP ใด ๆ ที่ได้รับอนุญาตให้มีเนื้อหาของข้อความและดังนั้นจึงต้องแยกข้อความที่มีในใจ อย่างไรก็ตามซีแมนทิกส์ของเซิร์ฟเวอร์สำหรับ GET นั้นถูก จำกัด เช่นนั้นหากเนื้อหานั้นไม่มีความหมายเชิงความหมายต่อการร้องขอ ข้อกำหนดในการวิเคราะห์คำแยกจากข้อกำหนดในวิธีอรรถศาสตร์

ใช่คุณสามารถส่งเนื้อหาที่มี GET และไม่มันไม่มีประโยชน์ที่จะทำเช่นนั้น

นี่เป็นส่วนหนึ่งของการออกแบบเลเยอร์ของ HTTP / 1.1 ที่จะชัดเจนอีกครั้งเมื่อข้อมูลจำเพาะถูกแบ่งพาร์ติชัน (กำลังดำเนินการอยู่)

.... รอย

ใช่คุณสามารถส่งคำขอเนื้อหาด้วย GET แต่ไม่ควรมีความหมายใด ๆ หากคุณให้ความหมายโดยการแยกวิเคราะห์บนเซิร์ฟเวอร์และเปลี่ยนการตอบกลับของคุณตามเนื้อหาคุณจะเพิกเฉยต่อคำแนะนำนี้ในข้อมูลจำเพาะ HTTP / 1.1 ส่วน 4.3 :

[... ] หากวิธีการร้องขอไม่ได้รวมซีแมนทิกส์ที่กำหนดไว้สำหรับเอนทิตีเนื้อหาจากนั้นเนื้อหาของข้อความSHOULDจะถูกละเว้นเมื่อจัดการคำขอ

และคำอธิบายของวิธีการ GET ในข้อมูลจำเพาะ HTTP / 1.1 ส่วน 9.3 :

วิธีการ GET หมายถึงการดึงข้อมูลใด ๆ ([... ]) ถูกระบุโดย Request-URI

ซึ่งระบุว่าร่างกายร้องขอไม่ได้เป็นส่วนหนึ่งของการระบุของทรัพยากรในการร้องขอ GET เพียง URI คำขอ

อัปเดต RFC2616 ที่อ้างอิงเป็น "ข้อมูลจำเพาะ HTTP / 1.1" ล้าสมัยแล้ว ในปี 2014 มันถูกแทนที่ด้วย RFCs 7230-7237 อ้างอิง "ข้อความเนื้อหาควรถูกละเว้นเมื่อจัดการคำขอ" ถูกลบไปแล้ว ตอนนี้เป็นเพียง "การร้องขอการกำหนดกรอบข้อความเป็นอิสระจากความหมายของวิธีแม้ว่าวิธีการจะไม่กำหนดการใช้งานใด ๆ สำหรับเนื้อหาข้อความ" การอ้างอิงที่ 2 "วิธีการ GET หมายถึงการดึงข้อมูลใด ๆ ... ถูกระบุโดย Request-URI" ถูกลบแล้ว - จากความคิดเห็น


71
การแคช / การมอบฉันทะเป็นสองสิ่งที่คุณน่าจะใช่ "ความหมาย" เป็นเพียงอีกวิธีหนึ่งในการพูดว่า "วิธีที่ผู้ใช้สร้างส่วนประกอบอื่นจะคาดหวังว่าส่วนประกอบอื่น ๆ จะทำงาน" หากคุณละเมิดความหมายคุณมีแนวโน้มที่จะเห็นสิ่งต่าง ๆ เกิดขึ้นในสถานที่ซึ่งผู้คนเขียนสิ่งต่าง ๆ ที่คาดหวังให้คุณเคารพความหมายเหล่านั้น
Stuart P. Bentley

108
Elasticsearch เป็นผลิตภัณฑ์ที่สำคัญพอสมควรที่ใช้เนื้อความคำขอ HTTP ใน GET ตามคู่มือของพวกเขาไม่ว่าจะเป็นคำขอ HTTP ควรมีร่างกายหรือไม่ไม่ได้กำหนด โดยส่วนตัวแล้วฉันรู้สึกไม่ค่อยสบายใจกับการเติมร่างคำขอของ GET แต่ดูเหมือนว่าพวกเขามีความคิดเห็นที่แตกต่างและพวกเขาต้องรู้ว่าพวกเขากำลังทำอะไร elastic.co/guide/en/elasticsearch/guide/current/...
GordonM

25
@iwein การให้หน่วยงานรับคำขอความหมายคือในความเป็นจริงไม่ใช่การละเมิดข้อกำหนด HTTP / 1.1ระบุว่าเซิร์ฟเวอร์ SHOULD เพิกเฉยต่อเนื้อหา แต่RFC 2119ระบุว่าผู้ใช้งานได้รับอนุญาตให้ข้ามส่วนคำสั่ง "SHOULD" หากพวกเขามีเหตุผลที่ดีในการทำเช่นนั้น ค่อนข้างลูกค้าจะละเมิดข้อกำหนดหากสันนิษฐานว่าการเปลี่ยนแปลงร่างกาย GET จะไม่เปลี่ยนการตอบสนอง
Emil Lundberg

107
RFC2616 ที่อ้างอิงเป็น "ข้อมูลจำเพาะ HTTP / 1.1" ล้าสมัยแล้ว ในปี 2014 มันถูกแทนที่ด้วย RFCs 7230-7237 พูด " ข้อความร่างกายควรละเลยเมื่อจัดการการร้องขอ " ได้รับการลบ ตอนนี้เป็นเพียง "การร้องขอการกำหนดกรอบข้อความเป็นอิสระจากความหมายของวิธีแม้ว่าวิธีการจะไม่กำหนดการใช้งานใด ๆ สำหรับเนื้อหาข้อความ " การอ้างอิงที่ 2 " วิธีการ GET หมายถึงการดึงข้อมูลใด ๆ ... ถูกระบุโดย Request-URI " ถูกลบ ดังนั้นฉันขอแนะนำให้แก้ไขคำตอบ @Jarl
Artem Nakonechny

28
ฉันรู้ว่ามันเป็นด้ายเก่า - ฉันสะดุดกับมัน @Artem Nakonechny ถูกต้องในทางเทคนิค แต่สเป็คใหม่บอกว่า"payload ภายในข้อความขอ GET ไม่มีความหมายที่กำหนดไว้การส่งเนื้อหาของ payload บนคำขอ GET อาจทำให้การใช้งานที่มีอยู่บางส่วนปฏิเสธคำขอ" ดังนั้นจึงไม่ใช่ความคิดที่ดีหากสามารถหลีกเลี่ยงได้
fastcatch

289

ในขณะที่คุณสามารถทำเช่นนั้นตราบเท่าที่มันไม่ได้ถูก จำกัด โดยข้อกำหนดของ HTTP อย่างชัดเจนฉันขอแนะนำให้หลีกเลี่ยงเพียงเพราะผู้คนไม่คาดหวังสิ่งต่าง ๆ ที่จะทำงานในลักษณะนั้น มีหลายขั้นตอนในห่วงโซ่การร้องขอ HTTP และในขณะที่พวกเขา "ส่วนใหญ่" เป็นไปตามข้อกำหนด HTTP สิ่งเดียวที่คุณมั่นใจได้ก็คือพวกเขาจะทำงานเหมือนเว็บเบราว์เซอร์ที่ใช้แบบดั้งเดิม (ฉันกำลังคิดถึงสิ่งต่าง ๆ เช่นพร็อกซี่โปร่งใสตัวเร่งความเร็วชุดเครื่องมือ A / V ฯลฯ )

นี่คือวิญญาณที่อยู่เบื้องหลังหลักการความแข็งแกร่ง "จงมีอิสระในสิ่งที่คุณยอมรับและอนุรักษ์ในสิ่งที่คุณส่ง" คุณไม่ต้องการผลักขอบเขตของข้อกำหนดโดยไม่มีเหตุผลที่ดี

อย่างไรก็ตามถ้าคุณมีเหตุผลที่ดีไปทำมัน


228
หลักการความทนทานมีข้อบกพร่อง หากคุณมีอิสระในสิ่งที่คุณยอมรับคุณจะได้รับอึหากคุณประสบความสำเร็จในแง่ของการยอมรับเพียงเพราะคุณยอมรับอึ ซึ่งจะทำให้การพัฒนาส่วนต่อประสานของคุณยากขึ้น แค่ดูที่ HTML นั่นคือหลักการในการปฏิบัติซ้ำ
Eugene Beresovsky

27
ฉันคิดว่าความสำเร็จและความกว้างของการยอมรับ (และการละเมิด) ของโปรโตคอลพูดถึงคุณค่าของหลักการความแข็งแกร่ง
caskey

39
คุณเคยลองแยก HTML จริงไหม? มันเป็นไปไม่ได้ที่จะติดตั้งด้วยตัวเองนั่นเป็นเหตุผลว่าทำไมเกือบทุกคน - รวมถึงผู้เล่นรายใหญ่อย่าง Google (Chrome) และ Apple (Safari) ไม่ได้ทำ แต่พึ่งการใช้งานที่มีอยู่แล้ว การใช้ซ้ำนั้นเป็นสิ่งที่ดี แต่คุณได้ลองแสดง html ในแอปพลิเคชัน. net หรือไม่ มันเป็นฝันร้ายเมื่อคุณต้องฝังองค์ประกอบที่ไม่ได้รับการจัดการ - IE (หรือคล้ายกัน) ที่มีปัญหาและข้อขัดข้องหรือคุณใช้องค์ประกอบที่มีการจัดการ (ใน codeplex) ที่ไม่สามารถแม้แต่ให้คุณเลือกข้อความได้
Eugene Beresovsky

6
ข้อมูลจำเพาะ HTTP ไม่เพียงช่วยให้ข้อมูลร่างกายที่มีการร้องขอ GET แต่ยังเป็นวิธีปฏิบัติทั่วไป: _search API ของเครื่องมือ ElasticSearch ที่ได้รับความนิยมแนะนำการร้องขอ GET ด้วยการสอบถามที่แนบมาในเนื้อหาของ JSON ในฐานะที่เป็นสัมปทานสำหรับการใช้งานไคลเอนต์ HTTP ที่ไม่สมบูรณ์ก็ยังอนุญาตให้โพสต์คำขอที่นี่
Christian Pietsch

3
@ChristianPietsch มันเป็นเรื่องธรรมดาในวันนี้ เมื่อสี่ปีก่อนมันไม่ใช่ ในขณะที่สเป็คอย่างชัดเจนช่วยให้ลูกค้าสามารถรวม (MAY) เอนทิตีในคำขอ (มาตรา 7) ความหมายของ MAY ถูกกำหนดใน RFC2119 และพร็อกซีเซิร์ฟเวอร์ โดยเฉพาะตราบใดที่มันไม่ผิดพลาดมันสามารถให้ 'ลดการทำงาน' โดยส่งต่อส่วนหัวของคำขอและไม่ใช่เอนทิตีที่รวมอยู่ ในทำนองเดียวกันมีโฮสต์ของกฎเกี่ยวกับการเปลี่ยนแปลงเวอร์ชันต้อง / MAY / SHOULD เมื่อทำ proxying ระหว่างระดับโปรโตคอลที่แตกต่างกัน
caskey

151

คุณอาจประสบปัญหาหากคุณพยายามใช้ประโยชน์จากแคช ผู้รับมอบฉันทะจะไม่ดูในเนื้อหาของ GET เพื่อดูว่าพารามิเตอร์มีผลกระทบต่อการตอบสนองหรือไม่


10
การใช้ฟิลด์ส่วนหัว ETag / Last-Modified ในลักษณะนี้: เมื่อใช้ "GET แบบมีเงื่อนไข" พร็อกซี / แคชสามารถใช้ข้อมูลนี้ได้
jldupont

2
@jldupont Caches ใช้การมีตัวตรวจสอบความถูกต้องเพื่อตรวจสอบว่าการตอบกลับเก่าสามารถตรวจสอบความถูกต้องได้อีกครั้ง แต่จะไม่ใช้เป็นส่วนหนึ่งของคีย์แคชหลักหรือรอง
Darrel Miller

คุณสามารถแก้ไขได้ด้วยการตรวจสอบร่างกายในพารามิเตอร์การสืบค้น
Adrian May

73

ทั้งrestclientและREST console ไม่รองรับสิ่งนี้ แต่ curl ทำได้

จำเพาะ HTTPกล่าวว่าในส่วน 4.3

ต้องไม่รวมเนื้อหาของข้อความในคำขอหากข้อมูลจำเพาะของวิธีการร้องขอ (ส่วน 5.1.1) ไม่อนุญาตให้ส่งเนื้อหาขององค์กรในคำขอ

ส่วน 5.1.1เปลี่ยนเส้นทางเราไปยังส่วน 9.x สำหรับวิธีการต่างๆ ไม่มีบุคคลใดที่ห้ามรวมข้อความอย่างชัดเจน อย่างไรก็ตาม ...

ส่วนที่ 5.2กล่าวว่า

ทรัพยากรที่แน่นอนที่ระบุโดยคำขอทางอินเทอร์เน็ตนั้นพิจารณาจากการตรวจสอบทั้ง Request-URI และฟิลด์ส่วนหัวของโฮสต์

และมาตรา 9.3พูดว่า

วิธีการ GET หมายถึงการดึงข้อมูลใด ๆ (ในรูปแบบของนิติบุคคล) จะถูกระบุโดย Request-URI

ซึ่งร่วมกันแนะนำว่าเมื่อประมวลผลคำขอ GET เซิร์ฟเวอร์ไม่จำเป็นต้องตรวจสอบสิ่งอื่นใดที่ฟิลด์ Request-URI และโฮสต์

โดยสรุปข้อมูลจำเพาะ HTTP ไม่ได้ป้องกันคุณจากการส่งเนื้อหา - ข้อความด้วย GET แต่มีความกำกวมเพียงพอที่จะไม่ทำให้ฉันแปลกใจหากเซิร์ฟเวอร์ทั้งหมดไม่รองรับ


2
Paw ยังมีตัวเลือกเพื่อรองรับคำขอ GET กับเนื้อความ แต่ต้องเปิดใช้งานในการตั้งค่า
s.Daniel

"วิธีการ GET หมายถึงการดึงข้อมูลใด ๆ (ในรูปแบบของเอนทิตี) ถูกระบุโดย Request-URI" จากนั้นเป็นเทคนิคที่ผิดกฎหมาย / ผิดที่จะมีจุดสิ้นสุด GET ที่ทำให้ทุกเอนทิตีหรือไม่ เช่นผลตอบแทนที่คอลเลกชันของที่อยู่สำหรับคนที่มีGET /contacts/100/addresses id=100
Josh M.

ไลบรารี Java ที่มั่นใจได้สำหรับการทดสอบ REST API ไม่สนับสนุนการร้องขอ GET กับเนื้อความ Apache HttpClient ไม่รองรับเช่นกัน
Paulo Merson

Django ยังสนับสนุนการแยกวิเคราะห์ร่างกาย GET
Bruno Finger

60

Elasticsearch ยอมรับคำขอของ GET พร้อมเนื้อหา มันก็ดูเหมือนว่านี่เป็นวิธีที่ต้องการ: คู่มือ Elasticsearch

บางไลบรารีไคลเอ็นต์ (เช่นไดร์เวอร์ Ruby) สามารถบันทึกคำสั่ง cry เพื่อ stdout ในโหมดการพัฒนาและใช้ไวยากรณ์นี้อย่างกว้างขวาง


5
สงสัยว่าทำไม Elasticsearch ถึงทำแบบนี้ นั่นหมายความว่าการค้นหานี้จะนับเอกสารทั้งหมดที่มีเพย์โหลดไปยังคำขอ GET curl -XGET 'http://localhost:9200/_count?pretty' -d ' { "query": { "match_all": {} } }' เทียบเท่ากับการรวมเพย์โหลดเป็นsourceพารามิเตอร์: curl -XGET 'http://localhost:9200/_count?pretty&source=%7B%22query%22%3A%7B%22match_all%22%3A%7B%7D%7D%7D'
อรุณ

40
ข้อความค้นหาที่ซับซ้อนสามารถเข้าถึงความยาวสูงสุดของส่วนหัว http
s.Daniel

11
มันกำลังอ่านเอกสาร elasticsearch ที่พาฉันไปที่คำถามนี้เพราะฉันคิดว่ามันเป็นการปฏิบัติที่ไม่ถูกต้องที่จะรวมเนื้อหา
PatrickWalker

1
ไม่จำเป็นต้องเป็นข้อความค้นหาที่ซับซ้อนอีกด้วย แม้แต่การเลื่อนแบบง่าย ๆ ก็สามารถส่งกลับ scroll_id ที่ยาวมาก (ในคลัสเตอร์ที่มีเศษจำนวนมาก) ซึ่งจะนำไปสู่การแทนที่ความยาว URL สูงสุดหากเพิ่มไปที่นั่น
Brent Hronik

11
Elasticsearch รองรับคำขอเดียวกันโดยใช้ POST พวกเขาเลือกที่จะอนุญาตให้เนื้อหาใน GET เท่านั้นเพราะพวกเขารู้สึกว่า GET นั้นถูกต้องทางอรรถศาสตร์มากกว่า POST เมื่อมาถึงการสืบค้นข้อมูล มันตลกที่ Elasticsearch ถูกกล่าวถึงมากในหัวข้อนี้ ฉันจะไม่ใช้ตัวอย่างหนึ่ง (แม้ว่าจะเป็นผลิตภัณฑ์ยอดนิยม) เป็นเหตุผลในการปฏิบัติตาม
DSO

33

สิ่งที่คุณพยายามจะทำให้สำเร็จนั้นได้ทำมาเป็นเวลานานด้วยวิธีการทั่วไปที่มากขึ้นและวิธีการที่ไม่ต้องพึ่งพาการใช้ payload กับ GET

คุณสามารถสร้างประเภทการค้นหาเฉพาะของคุณหรือถ้าคุณต้องการที่จะสงบมากขึ้นใช้อะไรเช่น OpenSearch และโพสต์คำขอไปยัง URI ที่เซิร์ฟเวอร์สั่งให้พูด / ค้นหา เซิร์ฟเวอร์สามารถสร้างผลลัพธ์การค้นหาหรือสร้าง URI สุดท้ายและเปลี่ยนเส้นทางโดยใช้ 303

สิ่งนี้มีข้อดีของการทำตามวิธี PRG แบบดั้งเดิมช่วยให้ตัวกลางแคชแคชผลลัพธ์เป็นต้น

ที่กล่าวว่า URIs ถูกเข้ารหัสอยู่แล้วสำหรับสิ่งที่ไม่ใช่ ASCII และดังนั้นจึงเป็น application / x-www-form-urlencoded และ multipart / form-data ฉันขอแนะนำให้ใช้สิ่งนี้แทนที่จะสร้างรูปแบบ json แบบกำหนดเองอีกรูปแบบหากคุณต้องการสนับสนุนสถานการณ์จำลอง


4
คุณสามารถสร้างสื่อการค้นหาเฉพาะของคุณได้ไหม
Piotr Dobrogost

2
โดยที่ฉันบอกว่าคุณสามารถสร้างประเภทสื่อที่เรียกว่า application / vnd.myCompany.search + json ซึ่งจะมีประเภทของเทมเพลตการค้นหาที่คุณต้องการให้ลูกค้าออกและจากนั้นลูกค้าสามารถส่งเป็น POST ดังที่ฉันได้เน้นว่ามีประเภทสื่อประเภทนั้นอยู่แล้วและเรียกว่า OpenSearch โดยการนำประเภทสื่อที่มีอยู่แล้วกลับมาใช้ใหม่ควรเลือกผ่านเส้นทางที่กำหนดเองเมื่อคุณสามารถนำสถานการณ์ของคุณไปใช้กับมาตรฐานที่มีอยู่
SerialSeb

14
มันฉลาด แต่ซับซ้อนเกินไปและไม่มีประสิทธิภาพ ตอนนี้คุณต้องส่ง POST พร้อมกับเกณฑ์การค้นหาของคุณรับ URI เป็นการตอบกลับจาก POST ของคุณจากนั้นส่ง GET พร้อมกับเกณฑ์การค้นหา URI ไปยังเซิร์ฟเวอร์เพื่อให้ GET เป็นเกณฑ์และส่งผลลัพธ์กลับมาให้คุณ (ยกเว้นว่าการรวม URI ใน URI นั้นเป็นไปไม่ได้ในทางเทคนิคเพราะคุณไม่สามารถส่งสิ่งที่มีความยาวสูงสุด 255 อักขระภายในบางสิ่งที่มีความยาวไม่เกิน 255 ตัวอักษร - ดังนั้นคุณต้องใช้ตัวระบุบางส่วนและเซิร์ฟเวอร์ของคุณ ต้องทราบวิธีแก้ไข URI สำหรับเกณฑ์การค้นหาที่โพสต์ของคุณ)
fijiaaron

30

คุณสามารถส่ง GET โดยใช้ร่างกายหรือส่ง POST และเลิกนับถือศาสนาอื่น ๆ (มันไม่เลวร้ายเมื่อ 5 ปีที่แล้วมีสมาชิกศรัทธาเพียงคนเดียว - ความคิดเห็นของเขาเชื่อมโยงด้านบน)

ไม่ใช่การตัดสินใจที่ยอดเยี่ยม แต่การส่งเนื้อหาของ GET อาจป้องกันปัญหาสำหรับลูกค้าบางราย - และเซิร์ฟเวอร์บางตัว

การทำโพสต์อาจมีอุปสรรคกับกรอบการคืนค่าใหม่

Julian Reschke แนะนำข้างต้นโดยใช้ส่วนหัว HTTP ที่ไม่ได้มาตรฐานเช่น "SEARCH" ซึ่งอาจเป็นโซลูชันที่สง่างามยกเว้นว่ามีโอกาสน้อยที่จะได้รับการสนับสนุน

มันอาจจะเป็นผลดีที่สุดในการทำรายชื่อลูกค้าที่สามารถและไม่สามารถทำสิ่งต่าง ๆ ข้างต้น

ลูกค้าที่ไม่สามารถส่ง GET ด้วยเนื้อหา (ที่ฉันรู้):

  • XmlHTTPRiddest Fiddler

ลูกค้าที่สามารถส่ง GET พร้อมเนื้อหา:

  • เบราว์เซอร์ส่วนใหญ่

เซิร์ฟเวอร์และไลบรารีที่สามารถดึงเนื้อหาจาก GET:

  • อาปาเช่
  • PHP

เซิร์ฟเวอร์ (และพรอกซี) ที่ดึงเนื้อหาจาก GET:

  • ?

2
Squid 3.1.6 ยังตัดแถบเนื้อความของ GET เมื่อความยาวของเนื้อหาเป็น 0 หรือไม่ได้ตั้งค่าและส่งกลับความยาว HTTP 411 ที่จำเป็นแม้ว่าจะมีการตั้งค่าความยาวไว้
ก็ตาม

2
พู้ทำเล่นจะ แต่จะเตือนคุณ
toddmo

คุณกำลังบอกว่าSEARCHวิธีการอาจจะแตกไปตามทางหรือไม่? หากผู้รับมอบฉันทะไม่เข้าใจวิธีการพวกเขาคาดว่าจะผ่านมันอย่างที่เป็นอยู่ดังนั้นฉันจึงไม่แน่ใจว่าทำไมคุณคิดว่ามันจะทำลายทุกอย่าง ...
Alexis Wilke

22

ฉันนำคำถามนี้ไปใช้กับ IETF HTTP WG ความคิดเห็นจาก Roy Fielding (ผู้เขียนเอกสาร http / 1.1 ในปี 1998) นั้น

"... การนำไปปฏิบัติจะแตกหักหากทำสิ่งอื่นนอกเหนือจากการแยกวิเคราะห์และทิ้งร่างนั้นหากได้รับ"

รัฐ RFC 7213 (HTTPbis):

"เพย์โหลดภายในข้อความขอ GET ไม่มีความหมายที่กำหนดไว้"

ดูเหมือนชัดเจนในตอนนี้ว่าเจตนาคือความหมายเชิงความหมายในหน่วยงานคำขอ GET เป็นสิ่งต้องห้ามซึ่งหมายความว่าไม่สามารถใช้เนื้อความคำขอเพื่อส่งผลต่อผลลัพธ์

มีผู้รับมอบฉันทะออกมีที่จะมีความแน่นอนทำลายคำขอของคุณในรูปแบบต่างๆถ้าคุณรวมร่างกายบน GET

ดังนั้นโดยสรุปอย่าทำมัน


21

เซิร์ฟเวอร์ใดที่จะเพิกเฉย - fijiaaron 30 ส.ค. 2555 เวลา 21:27 น

ตัวอย่างเช่นGoogleกำลังทำสิ่งที่เลวร้ายยิ่งกว่าการเพิกเฉยมันจะพิจารณาว่าเป็นข้อผิดพลาด !

ลองด้วยตัวคุณเองด้วย netcat แบบง่าย ๆ :

$ netcat www.google.com 80
GET / HTTP/1.1
Host: www.google.com
Content-length: 6

1234

(เนื้อหา 1234 จะตามด้วย CR-LF ดังนั้นจะมีทั้งหมด 6 ไบต์)

และคุณจะได้รับ:

HTTP/1.1 400 Bad Request
Server: GFE/2.0
(....)
Error 400 (Bad Request)
400. That’s an error.
Your client has issued a malformed or illegal request. That’s all we know.

คุณจะได้รับ 400 Bad Request จาก Bing, Apple และอื่น ๆ ... ซึ่ง AkamaiGhost ให้บริการ

ดังนั้นฉันจะไม่แนะนำให้ใช้คำขอ GET กับเอนทิตีร่างกาย


65
ตัวอย่างนี้ไม่มีประโยชน์เพราะโดยปกติแล้วเมื่อผู้คนจะเพิ่มเนื้อหาลงในGETคำขอมันเป็นเพราะเซิร์ฟเวอร์ที่กำหนดเองของพวกเขาเองสามารถจัดการกับมันได้ คำถามคือว่า "ส่วนที่เคลื่อนไหว" อื่น ๆ (เบราว์เซอร์แคช ฯลฯ ) จะทำงานได้อย่างถูกต้องหรือไม่
Pacerier

6
นี่เป็นคำขอที่ไม่ถูกต้องเนื่องจากไม่ได้คาดหวังส่วนของข้อมูลของคุณ (หรือมีเหตุผล) สำหรับGET จุดปลายนั้น - ไม่มีส่วนเกี่ยวข้องกับการใช้งานGETในกรณีทั่วไป เพย์โหลดแบบสุ่มสามารถแบ่งPOSTได้อย่างง่ายดายและกลับมาเหมือนเดิม400 Bad Requestหากเนื้อหาไม่อยู่ในรูปแบบที่เหมาะสมในบริบทของคำขอเฉพาะ
สูงศักดิ์

และไม่ใช่เฉพาะจุดปลายทางนั้นโดยรวม แต่เป็นURL เฉพาะนั้น
Lawrence Dol

1
สิ่งนี้ไม่เกี่ยวข้องเนื่องจากเป็นเพียงการใช้งานเซิร์ฟเวอร์ของ Google ที่ URL นั้น ดังนั้นจึงไม่มีเหตุผลสำหรับคำถาม
Joel Duckworth

สำหรับฉันมันมีประโยชน์เพราะฉันพยายามใช้ฟังก์ชั่นฐานข้อมูลที่มีการร้องขอ + เนื้อหาและข้อผิดพลาดนี้อาจเป็นความลับและเข้าใจยาก
scrimau

19

จากRFC 2616 ส่วน 4.3 "เนื้อหาของข้อความ":

เซิร์ฟเวอร์ควรอ่านและส่งต่อเนื้อความในการร้องขอใด ๆ ; หากวิธีการร้องขอไม่ได้รวมซีแมนทิกส์ที่กำหนดไว้สำหรับเอนทิตีเนื้อหาจากนั้นเนื้อหาของข้อความ SHOULD จะถูกละเว้นเมื่อจัดการคำขอ

นั่นคือเซิร์ฟเวอร์ควรอ่านเนื้อความคำขอใด ๆ ที่จัดไว้ให้จากเครือข่าย (ตรวจสอบความยาวเนื้อหาหรืออ่านเนื้อหาที่มีการสับเปลี่ยนเป็นต้น) นอกจากนี้ผู้รับมอบฉันทะควรส่งต่อสิ่งที่ร้องขอดังกล่าวที่ได้รับ จากนั้นหาก RFC กำหนดซีแมนทิกส์สำหรับเนื้อความสำหรับวิธีการที่กำหนดเซิร์ฟเวอร์สามารถใช้เนื้อความคำขอจริงในการสร้างการตอบสนอง อย่างไรก็ตามหาก RFC ไม่ได้กำหนดซีแมนทิกส์สำหรับเนื้อความเซิร์ฟเวอร์ควรละเว้น

นี่เป็นไปตามที่อ้างจากฟีลดิงข้างต้น

ส่วน 9.3 "GET" อธิบายถึงความหมายของวิธีการ GET และไม่ได้กล่าวถึงเนื้อหาที่ร้องขอ ดังนั้นเซิร์ฟเวอร์ควรเพิกเฉยต่อคำขอใด ๆ ที่ได้รับจากคำขอ GET


ส่วนที่ 9.5 "POST" ไม่ได้กล่าวถึงเนื้อหาร้องขอดังนั้นตรรกะนี้จึงมีข้อบกพร่อง
CarLuva

9
@CarLuva ส่วน POST บอกว่า "วิธีการ POST ใช้เพื่อขอให้เซิร์ฟเวอร์ต้นทางยอมรับเอนทิตีที่แนบมา ... " ส่วนเนื้อหาของเอนทิตีกล่าวว่า "เอนทิตีเนื้อหาได้มาจากข้อความ - เนื้อหา ... " ดังนั้น ส่วน POST ไม่พูดถึงเนื้อหาของข้อความแม้ว่าโดยทางอ้อมโดยอ้างอิงเนื้อหาของเอนทิตีซึ่งดำเนินการโดยเนื้อหาข้อความของคำขอ POST
frederickf

9

ตาม XMLHttpRequest มันไม่ถูกต้อง จากมาตรฐาน :

4.5.6 send()วิธีการ

client . send([body = null])

เริ่มต้นคำขอ อาร์กิวเมนต์ที่เป็นทางเลือกจัดเตรียมเนื้อความคำขอ อาร์กิวเมนต์จะถูกละเว้นถ้าวิธีการร้องขอหรือGETHEAD

ส่งInvalidStateErrorข้อยกเว้นหากสถานะใดสถานะหนึ่งไม่ถูก เปิดหรือsend()ตั้งค่าสถานะ

วิธีการต้องเรียกใช้ขั้นตอนเหล่านี้:send(body)

  1. หากไม่ได้เปิดสถานะให้โยนInvalidStateErrorข้อยกเว้น
  2. หากsend()มีการตั้งค่าสถานะโยนInvalidStateErrorข้อยกเว้น
  3. หากวิธีการร้องขอเป็นGETหรือHEADตั้งค่าร่างกายเป็นโมฆะ
  4. ถ้าร่างกายเป็นโมฆะไปที่ขั้นตอนถัดไป

แม้ว่าฉันไม่คิดว่ามันควรจะเพราะคำขอ GET อาจต้องการเนื้อหาที่มีขนาดใหญ่

ดังนั้นหากคุณพึ่งพา XMLHttpRequest ของเบราว์เซอร์เป็นไปได้ว่ามันจะไม่ทำงาน


1
downvoted เนื่องจากความจริงที่ว่า XMLHttpRequest เป็นการใช้งาน อาจไม่สะท้อนข้อมูลจำเพาะที่แท้จริงที่ควรนำไปใช้
floum

10
Downvote ด้านบนผิดหากการใช้งานบางอย่างไม่สนับสนุนการส่งเนื้อหาที่มี GET นั่นอาจเป็นเหตุผลที่จะไม่ทำเช่นนั้นโดยไม่คำนึงถึงข้อกำหนด ฉันเจอปัญหานี้ในผลิตภัณฑ์ข้ามแพลตฟอร์มที่ฉันกำลังทำอยู่ - เฉพาะแพลตฟอร์มที่ใช้ XMLHttpRequest ล้มเหลวในการส่งรับ
pjcard

8

ถ้าคุณอยากที่จะส่ง JSON ร่างกาย / XML cachable ไปยังโปรแกรมประยุกต์เว็บสถานที่เดียวที่เหมาะสมที่จะนำข้อมูลของคุณสตริงแบบสอบถามเข้ารหัสด้วยRFC4648: ฐาน 64 เข้ารหัสด้วย URL และชื่อไฟล์เซฟตัวอักษร แน่นอนคุณสามารถ urlencode JSON และใส่เป็นค่าของ URL พารามิเตอร์ แต่ Base64 ให้ผลลัพธ์ที่มีขนาดเล็กลง โปรดทราบว่ามีข้อ จำกัด ขนาด URL โปรดดูความยาวสูงสุดของ URL ในเบราว์เซอร์ที่ต่างกันคือเท่าใด .

คุณอาจคิดว่า padding Base64 ของ=ตัวละครอาจจะไม่ดีสำหรับค่าพารามิเตอร์ของ URL แต่ดูเหมือนไม่ได้ - ดูการอภิปรายนี้: http://mail.python.org/pipermail/python-bugs-list/2007-February/037195.html อย่างไรก็ตามคุณไม่ควรใส่ข้อมูลที่เข้ารหัสโดยไม่มีชื่อพารามิเตอร์เนื่องจากสตริงที่เข้ารหัสด้วยการขยายจะถูกตีความว่าเป็นคีย์พารามิเตอร์ที่มีค่าว่าง ?_b64=<encodeddata>ฉันจะใช้สิ่งที่ต้องการ


ฉันคิดว่านี่เป็นความคิดที่ไม่ดี :) แต่ถ้าฉันทำสิ่งนี้ฉันจะใช้ส่วนหัว HTTP ที่กำหนดเองแทน (และตรวจสอบให้แน่ใจว่าฉันส่ง Vary: ในการตอบกลับ)
หลีกเลี่ยง

ไม่ดีหรือไม่ แต่ :) doable กับข้อมูลในส่วนหัวมีปัญหาที่คล้ายกันกับขนาดของข้อมูลดูstackoverflow.com/questions/686217/... อย่างไรก็ตามขอบคุณที่กล่าวถึงVaryส่วนหัวฉันไม่ได้ตระหนักถึงศักยภาพที่แท้จริง
gertas

6

ฉันจะไม่แนะนำสิ่งนี้มันขัดกับหลักปฏิบัติทั่วไปและไม่ได้ให้ผลตอบแทนมากนัก คุณต้องการให้เนื้อหาเป็นเนื้อหาไม่ใช่ตัวเลือก


5

ส่วนหัวที่เข้ารหัสไม่เป็นไปตาม base64 หรือไม่ "SOMETHINGAPP-params: sdfSD45fdg45 / AS"

ข้อจำกัดความยาว hm คุณไม่สามารถทำการจัดการ POST แยกแยะระหว่างความหมายได้หรือไม่? หากคุณต้องการพารามิเตอร์อย่างง่ายเช่นการเรียงลำดับฉันไม่เห็นสาเหตุที่เป็นปัญหา ฉันเดาว่าแน่นอนว่าคุณเป็นห่วง


คุณสามารถส่งพารามิเตอร์ใด ๆ ที่คุณต้องการด้วยx-คำนำหน้าข้อ จำกัด ใด ๆ เกี่ยวกับความยาวของส่วนหัวจะเป็นข้อ จำกัด เซิร์ฟเวอร์โดยพลการ
Chris Marisic

4

ฉันเสียใจที่ REST เนื่องจากโปรโตคอลไม่รองรับ OOP และGetวิธีนี้เป็นข้อพิสูจน์ ในฐานะที่เป็นวิธีแก้ปัญหาคุณสามารถทำให้อนุกรม DTO ของคุณเป็น JSON จากนั้นสร้างสตริงการสืบค้น ในฝั่งเซิร์ฟเวอร์คุณจะสามารถทำการดีซีเรียลไลซ์สตริงการสืบค้นให้กับ DTO ได้

ดูที่:

วิธีการตามข้อความสามารถช่วยให้คุณแก้ปัญหารับข้อ จำกัด ของวิธีการ คุณจะสามารถส่ง DTO ใด ๆ ก็ได้ตามที่ร้องขอ

เฟรมเวิร์กบริการเว็บ Nelibur มีฟังก์ชันการทำงานที่คุณสามารถใช้ได้

var client = new JsonServiceClient(Settings.Default.ServiceAddress);
var request = new GetClientRequest
    {
        Id = new Guid("2217239b0e-b35b-4d32-95c7-5db43e2bd573")
    };
var response = client.Get<GetClientRequest, ClientResponse>(request);

as you can see, the GetClientRequest was encoded to the following query string

http://localhost/clients/GetWithResponse?type=GetClientRequest&data=%7B%22Id%22:%2217239b0e-b35b-4d32-95c7-5db43e2bd573%22%7D

8
คุณควรใช้ POST หากมีชื่อวิธีใน url คุณกำลังละเมิดการออกแบบส่วนที่เหลือพื้นฐาน นี่คือ RPC ใช้ POST
หลีกเลี่ยง

3
ฉันไม่คิดว่าเป็นเรื่องใหญ่เรามีปัญหามากขึ้นในระหว่างการพัฒนาด้วย RESTful url (เช่นคำสั่งซื้อ / 1) สำหรับฉันมีบางอย่างผิดปกติกับวิธีรับก็ไม่เข้ากันกับ OOP และใครสนใจว่า url มีหน้าตาเป็นอย่างไร :) แต่ด้วยวิธีการที่อิงกับข้อความเราสามารถสร้างส่วนต่อประสานระยะไกลที่เสถียรและสำคัญมาก PS ไม่ใช่ RPC เป็นข้อความตาม
GSerjo

3
ฉันคิดว่าคุณไม่มีจุดรวมของ REST เมื่อคุณพูดว่าใครสนใจสิ่งที่ URL ดูเหมือนว่า REST ใส่ใจมาก และทำไมส่วนที่เหลือจะเข้ากันได้กับ OOP
shmish111

ไม่ฉันไม่เห็นเลยสักหน่อย
GSerjo

4

ตัวอย่างเช่นทำงานกับ Curl, Apache และ PHP

ไฟล์ PHP:

<?php
echo $_SERVER['REQUEST_METHOD'] . PHP_EOL;
echo file_get_contents('php://input') . PHP_EOL;

คำสั่งคอนโซล:

$ curl -X GET -H "Content-Type: application/json" -d '{"the": "body"}' 'http://localhost/test/get.php'

เอาท์พุท:

GET
{"the": "body"}

การทดลองที่สนุก! PHP จะอ่านใน$_POSTเมื่อร่างกายถูกส่งไปพร้อมกับคำขอ POST application/x-www-form-urlencodedและ นั่นหมายความว่าเนื้อความถูกละเว้นในGETคำขอ ในกรณีนี้: $_GETและ$_POSTทำให้เข้าใจผิดมากในตอนนี้ ใช้งานได้ดีขึ้นphp://input
Martin Muzatko

3

IMHO คุณสามารถส่งการJSONเข้ารหัส (เช่นencodeURIComponent) ในURLวิธีนี้คุณจะไม่ละเมิดHTTPรายละเอียดและนำคุณJSONไปยังเซิร์ฟเวอร์


28
ใช่ แต่ปัญหาสำคัญคือขีดจำกัดความยาวเราจะจัดการกับมันอย่างไร?
Sebas

2

คุณมีรายการตัวเลือกที่ดีกว่าการใช้เนื้อหาคำขอกับ GET

สมมติว่าคุณมีหมวดหมู่และรายการสำหรับแต่ละหมวดหมู่ ทั้งสองจะถูกระบุโดย id ("catid" / "itemid" เพื่อเป็นตัวอย่างนี้) คุณต้องการจัดเรียงตามพารามิเตอร์อื่น "sortby" ใน "order" ที่เฉพาะเจาะจง คุณต้องการส่งพารามิเตอร์สำหรับ "sortby" และ "order":

คุณสามารถ:

  1. ใช้สตริงแบบสอบถามเช่น example.com/category/{catid}/item/{itemid}?sortby=itemname&order=asc
  2. ใช้ mod_rewrite (หรือคล้ายกัน) สำหรับเส้นทาง: example.com/category/{catid}/item/{itemid}/{sortby}/{order}
  3. ใช้ส่วนหัว HTTP แต่ละรายการที่คุณผ่านพร้อมคำขอ
  4. ใช้วิธีอื่นเช่น POST เพื่อดึงทรัพยากร

ทุกคนมีข้อเสีย แต่ก็ยังดีกว่าการใช้ GET กับร่างกาย


0

แม้ว่าเครื่องมือยอดนิยมจะใช้สิ่งนี้ตามที่อ้างถึงบ่อยครั้งในหน้านี้ฉันคิดว่ามันยังเป็นความคิดที่ไม่ดีอยู่ดีเกินไปแม้ว่าจะไม่ได้รับอนุญาตจากสเป็ค

โครงสร้างพื้นฐานระดับกลางหลายแห่งอาจปฏิเสธคำขอดังกล่าว

โดยตัวอย่างลืมเกี่ยวกับการใช้บางส่วนของ CDN ที่มีอยู่ในด้านหน้าของเว็บไซต์ของคุณเช่นนี้หนึ่ง :

หากGETคำขอของผู้ดูมีเนื้อหา BodyFront จะส่งคืนรหัสสถานะ HTTP 403 (ต้องห้าม) ให้กับผู้ดู

และใช่ห้องสมุดลูกค้าของคุณอาจไม่สนับสนุนการส่งคำขอดังกล่าวตามที่รายงานไว้ในความคิดเห็นนี้


0

ฉันใช้ RestTemplate ของ Spring framework ในโปรแกรมไคลเอนต์ของฉันและที่ฝั่งเซิร์ฟเวอร์ฉันได้กำหนดคำขอ GET ด้วยเนื้อความ Json จุดประสงค์หลักของฉันก็เหมือนกับของคุณ: เมื่อคำขอมีพารามิเตอร์จำนวนมากการใส่ไว้ในร่างกายดูเหมือนจะเป็นระเบียบเรียบร้อยกว่าการใส่ไว้ในสตริง URI ที่ยืดเยื้อ ใช่?

แต่น่าเศร้าที่มันไม่ทำงาน! ฝั่งเซิร์ฟเวอร์ส่งข้อยกเว้นต่อไปนี้:

org.springframework.http.converter.HttpMessageNotReadableException: เนื้อหาคำขอที่ต้องการหายไป ...

แต่ฉันค่อนข้างแน่ใจว่าเนื้อหาของข้อความนั้นถูกต้องโดยรหัสลูกค้าของฉันดังนั้นเกิดอะไรขึ้น

ฉันติดตามไปยังเมธอด RestTemplate.exchange () และพบสิ่งต่อไปนี้:

// SimpleClientHttpRequestFactory.class
public class SimpleClientHttpRequestFactory implements ClientHttpRequestFactory, AsyncClientHttpRequestFactory {
    ...
    protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
        ...
        if (!"POST".equals(httpMethod) && !"PUT".equals(httpMethod) && !"PATCH".equals(httpMethod) && !"DELETE".equals(httpMethod)) {
            connection.setDoOutput(false);
        } else {
            connection.setDoOutput(true);
        }
        ...
    }
}

// SimpleBufferingClientHttpRequest.class
final class SimpleBufferingClientHttpRequest extends AbstractBufferingClientHttpRequest {
    ...
    protected ClientHttpResponse executeInternal(HttpHeaders headers, byte[] bufferedOutput) throws IOException {
        ...
        if (this.connection.getDoOutput() && this.outputStreaming) {
            this.connection.setFixedLengthStreamingMode(bufferedOutput.length);
        }

        this.connection.connect();
        if (this.connection.getDoOutput()) {
            FileCopyUtils.copy(bufferedOutput, this.connection.getOutputStream());
        } else {
            this.connection.getResponseCode();
        }
        ...
    }
}

โปรดสังเกตว่าในเมธอด executeInternal () อาร์กิวเมนต์อินพุต 'bufferedOutput' มีเนื้อหาข้อความที่ระบุโดยรหัสของฉัน ฉันเห็นมันผ่านตัวดีบั๊ก

อย่างไรก็ตามเนื่องจากการเตรียมความพร้อมการเชื่อมต่อ (), getDoOutput () ใน executeInternal () มักจะส่งกลับเท็จซึ่งในทางกลับกันทำให้ bufferedOutput ถูกเพิกเฉยอย่างสมบูรณ์! มันไม่ได้คัดลอกไปยังสตรีมเอาต์พุต

ดังนั้นโปรแกรมเซิร์ฟเวอร์ของฉันไม่ได้รับเนื้อหาข้อความและส่งข้อยกเว้นนั้น

นี่คือตัวอย่างเกี่ยวกับ RestTemplate ของ Spring framework ประเด็นก็คือแม้ว่าเนื้อหาข้อความจะไม่ได้รับอนุญาตจากข้อกำหนด HTTP อีกต่อไปไคลเอนต์หรือเซิร์ฟเวอร์ไลบรารีหรือกรอบงานบางอย่างอาจยังคงสอดคล้องกับข้อมูลจำเพาะเก่าและปฏิเสธเนื้อหาข้อความจากคำขอ GET


คุณไม่ได้อ่านข้อมูลจำเพาะหรือความคิดเห็นที่นี่อย่างถูกต้อง ลูกค้าและเซิร์ฟเวอร์ที่ปล่อยเนื้อหาร้องขออยู่ในข้อมูลจำเพาะ อย่าใช้หน่วยคำขอ GET
ปลิ้น

@Evert ฉันไม่ได้อ่านความคิดเห็นอย่างถูกต้องหรือไม่? :) หากคุณเลื่อนไปที่คำตอบของ Paul Morgan (คำตอบที่ถูกกดปุ่มด้านบน) และอ่านความคิดเห็นอย่างระมัดระวังคุณจะพบสิ่งนี้: "RFC2616 ที่อ้างอิงว่า" HTTP / 1.1 spec "ล้าสมัยแล้วในปี 2014 มันถูกแทนที่ด้วย RFCs 7230-7237 อ้างว่า "เนื้อหาข้อความจะถูกละเว้นเมื่อจัดการคำขอ" ถูกลบไปแล้วตอนนี้เป็นเพียง "การกำหนดกรอบข้อความคำขอเป็นอิสระจากความหมายของวิธีการแม้ว่าวิธีการจะไม่กำหนดการใช้งานใด ๆ สำหรับเนื้อหาข้อความ ... "
โจว

@Evert ยิ่งกว่านั้นฉันใช้ยูทิลิตีการทดสอบ REST "มั่นใจ" เพื่อทดสอบแบ็คเอนด์ Spring-boot ของฉัน ทั้งมั่นใจได้และ Spring-boot server-side เก็บ Json body ไว้เพื่อรับคำขอ! เฉพาะ RestTemplate ของ Sping-framework เท่านั้นที่ปล่อยร่างกายจากคำขอ GET ดังนั้น Spring-boot มั่นใจได้และ RestTemplate ซึ่งเป็นสิ่งที่ผิด
โจว

@Ever สุดท้าย แต่ไม่ให้เช่าฉันไม่ได้กระตุ้นให้คนใช้เนื้อหาในคำขอ GET แต่ฉันแนะนำว่าอย่าทำเช่นนั้นโดยการวิเคราะห์ซอร์สโค้ดของ RestTemplate ของ Sping-framework ดังนั้นทำไมคุณถึงลงคะแนนฉัน ตอบ?
Zhou

ฉันไม่ได้ลงคะแนนคำตอบของคุณ ฉันแค่ชี้แจงว่าการติดตั้ง HTTP ใด ๆ ที่ทำให้คำขอ GET ตกอยู่ในข้อมูลจำเพาะ
ปลิ้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.