การส่งคืน 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.