การส่งคืน 202 "ยอมรับ" ในการตอบสนองต่อ HTTP GET ผิดหรือไม่


90

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

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

สาเหตุของพฤติกรรมนี้มีดังต่อไปนี้: หากผลลัพธ์พร้อมใช้งานภายในไม่กี่วินาทีจำเป็นต้องดึงข้อมูลโดยเร็วที่สุด มิฉะนั้นจะพร้อมใช้งานเมื่อใดก็ไม่สำคัญ

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

ฉันคิดว่ามีข้อโต้แย้งเกี่ยวกับการส่งคืนรหัสสถานะ 202 "ที่ยอมรับ" เพื่อตอบสนองต่อคำขอ GET โดยที่ฉันไม่เคยเห็นในทางปฏิบัติและการใช้งานที่ง่ายที่สุดคือการตอบสนองต่อวิธีการที่ไม่ปลอดภัย แต่ฉันไม่เคย พบสิ่งที่ทำให้ท้อใจเป็นพิเศษ ยิ่งไปกว่านั้นฉันไม่ได้รักษาทั้งความปลอดภัยและความเป็นส่วนตัวใช่หรือไม่?

แล้วคนคิดอย่างไรเกี่ยวกับแนวทางนี้?

แก้ไข : ฉันควรพูดถึงสิ่งนี้สำหรับเว็บ API ที่เรียกว่าธุรกิจไม่ใช่สำหรับเบราว์เซอร์


2
โดยส่วนตัวแล้วฉันคิดว่ามันดีมันตรงกับคำจำกัดความของไฟล์202. สิ่งที่แทบจะไม่ได้ใช้ในทางปฏิบัติคือ IMHO มากกว่าเนื่องจากนักพัฒนาเว็บเพียงไม่กี่รายสนใจเกี่ยวกับรหัสสถานะที่เหมาะสมเนื่องจากพวกเขาคุ้นเคยกับการโต้ตอบกับเบราว์เซอร์ / ตัวแทนผู้ใช้มากกว่าซึ่งในกรณีนี้ a 202จะทำให้พวกเขาไม่มีเงื่อนงำที่มองเห็นได้ (ให้200และพวกเขามีความสุข .. ).
Wrikken

1
@ user359996 เพียงใช้200. 202เป็นสิ่งที่มันควรจะเป็น 202แต่ในทางปฏิบัติคนที่ไม่ได้คาดหวัง
Pacerier

มันต้องการ ETA สำหรับ 200 เพื่อเป็นประโยชน์ในทางปฏิบัติ
Rob

คำตอบ:


66

ถ้ามันเป็น API ดีที่กำหนดและ -documented, 202เสียงว่าเหมาะสมสำหรับสิ่งที่เกิดขึ้น

หากเป็นอินเทอร์เน็ตสาธารณะฉันคงกังวลเกี่ยวกับความเข้ากันได้ของไคลเอ็นต์มากเกินไป ฉันเคยเห็นif (status == 200)รหัสยากมากมาย.... ในกรณีนั้นฉันจะคืน a 200.

นอกจากนี้RFCยังไม่มีข้อบ่งชี้ว่าการใช้ 202 สำหรับคำขอ GET นั้นผิดในขณะที่มีความแตกต่างอย่างชัดเจนในคำอธิบายรหัสอื่น ๆ (เช่น 200)

คำขอได้รับการยอมรับสำหรับการประมวลผล แต่การประมวลผลยังไม่เสร็จสมบูรณ์


17

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

สิ่งที่สำคัญที่สุดคือการบันทึกวิธีการทำงานของบริการ / API ของคุณและคำตอบของ 202 หมายถึงอะไร


+1 ขอบคุณสำหรับความคิดเห็นของคุณ จุดที่ดีเกี่ยวกับเอกสาร แต่โปรดสังเกตการแก้ไขที่ชัดเจนสำหรับคำถามของฉัน (มองหา "โรงงาน")
user359996

คุณสามารถละเว้น URI นั้นในการตอบกลับได้หากคุณต้องการสำรวจความคิดเห็น URI เดียวกันกับที่คุณร้องขอในตอนแรก (เอกสารเพียงวิธีนี้ควรจะทำงาน :-))
เลขที่

เป็นความคิดที่ดี แต่จำไว้ว่าฉันต้องการแคชดังนั้นจึงไม่ต้องโพสต์ นอกจากนี้ URI ยังระบุทรัพยากรไม่ใช่วิธีการ ฉันใช้วิธี RESTful มากกว่า RPC (ขออภัยข้อ จำกัด อื่นที่ไม่ระบุ - ไม่ดีของฉัน)
user359996

เพื่อความแม่นยำโดย "RESTful" ฉันหมายถึง "เน้นทรัพยากร" ซึ่งในทางเทคนิคมากกว่าที่กำหนดโดยข้อ จำกัด REST เล็กน้อย
user359996

นอกจากนี้ยังได้รับการสนับสนุนโดย "1.10 How to Use POST for Asynchronous Tasks" โดยหนังสือ " RESTful Web Services Cookbook " โดยSubbu Allamraju
koppor

12

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

ในทางกลับกัน POST คือการร้องขอเพื่อเปลี่ยนสถานะของบางสิ่งบนเซิร์ฟเวอร์ แทรกบันทึกลบบันทึกเรียกใช้งานอะไรทำนองนั้น 202 จะเหมาะสมกับ POST ที่ส่งคืน แต่ยังไม่เสร็จสิ้น แต่ไม่ใช่คำขอ GET จริงๆ

ทุกอย่างเป็นคนเจ้าระเบียบมากและไม่ได้รับการฝึกฝนมาอย่างดีในป่าดังนั้นคุณอาจปลอดภัยโดยการส่งคืน 202 GET ควรคืน 200 POST สามารถคืน 200 ได้หากเสร็จสิ้นหรือ 202 หากยังไม่เสร็จ

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


4
การคิดที่ดีมาก แต่ฉันไม่แน่ใจว่าจะใช้ได้หรือไม่: จากสิ่งที่ OP กล่าวดูเหมือนว่าจะเป็นคำขอ GET ที่เหมาะสม (เนื่องจากไม่ได้เปลี่ยนแปลงอะไรบนเซิร์ฟเวอร์) ใช้เวลาในการคำนวณและใน ในกรณีนั้นจะถูกดึงข้อมูลในเวลาอื่น บางที OP อาจให้ความเห็นที่เชื่อถือได้ สำหรับ API ดังนั้นจึงเป็นการดีที่จะ "เจ้าระเบียบ" เพื่อประโยชน์ของอินเทอร์เฟซที่สะอาด
Pekka

โอ้ Touche Pekka คุณพูดถูก GET คือหนทางที่จะไป และฉันไม่คิดว่า HTTP spc คำนึงถึง GET ที่ยังไม่พร้อมจริงๆ ดังนั้นเขาจึงสามารถไปทางใดก็ได้
Dlongnecker

7
(ตอนนี้ไม่เกี่ยวข้อง) ความคิดเห็นที่เชื่อถือได้: ใช่ฉันมองว่าสิ่งนี้เป็นเรื่องปกติ ทรัพยากรจะไม่ถูกแก้ไขหรือสร้างค่อนข้างจะเป็นตัวแทนที่ยังไม่ได้รับการคำนวณ
user359996

1
ไหนบอกว่า? นอกจากนี้หากฉันส่งคืน 200 ลูกค้าควรคาดหวังว่าจะมีการส่งคืนการเป็นตัวแทน แต่ไม่ได้
user359996

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

0

ในกรณีของทรัพยากรที่ควรจะเป็นตัวแทนของเอนทิตีที่ระบุไว้อย่างชัดเจนโดย ID (ซึ่งตรงข้ามกับทรัพยากร "โรงงาน" ตามที่อธิบายไว้ในคำถาม) ขอแนะนำให้ใช้วิธี GET และใน สถานการณ์เมื่อเอนทิตี / การเป็นตัวแทนไม่พร้อมใช้งานเนื่องจากการสร้างแบบขี้เกียจหรือสถานการณ์ชั่วคราวอื่น ๆ ให้ใช้รหัสตอบกลับ 503 Service Unavailable ที่เหมาะสมกว่าและได้รับการออกแบบมาสำหรับสถานการณ์เช่นนี้

เหตุผลนี้สามารถพบได้ใน RFCs สำหรับ HTTP (โปรดตรวจสอบคำอธิบายของรหัสตอบกลับ 503) รวมถึงแหล่งข้อมูลอื่น ๆ อีกมากมาย

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

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