รหัสสถานะ HTTP สำหรับ“ การประมวลผลยังคง”


47

ฉันกำลังสร้าง RESTful API ที่รองรับการจัดคิวงานระยะยาวเพื่อการจัดการในที่สุด

เวิร์กโฟลว์ทั่วไปสำหรับ API นี้จะเป็น:

  1. ผู้ใช้กรอกข้อมูลในแบบฟอร์ม
  2. ลูกค้าโพสต์ข้อมูลไปยัง API
  3. API ส่งคืนยอมรับ 202
  4. ลูกค้าเปลี่ยนเส้นทางผู้ใช้ไปยัง URL ที่ไม่ซ้ำกันสำหรับคำขอนั้น ( /results/{request_id})
  5. ~ ~ ในที่สุด
  6. URL ที่ลูกค้าเยี่ยมชมอีกครั้งและเห็นผลลัพธ์ในหน้านั้น

ปัญหาของฉันอยู่ในขั้นตอนที่ 6 ทุกครั้งที่ผู้ใช้เยี่ยมชมหน้าเว็บฉันจะส่งคำขอไปยัง API ของฉัน ( GET /api/results/{request_id}) เป็นการดีที่งานจะเสร็จสมบูรณ์ในขณะนี้และฉันจะส่งคืน 200 OK พร้อมผลลัพธ์ของงานของพวกเขา

แต่ผู้ใช้มีความเร่งรีบและฉันคาดหวังว่าการรีเฟรชมากเกินไปเมื่อผลลัพธ์ยังไม่เสร็จสิ้นการประมวลผล

ตัวเลือกที่ดีที่สุดของฉันสำหรับรหัสสถานะคืออะไร:

  • คำขอนี้มีอยู่
  • มันยังไม่เสร็จ
  • แต่มันก็ไม่ได้ล้มเหลว

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

มันสมเหตุสมผลแล้วที่จะส่งคืนค่า 202 เนื่องจากไม่มีความหมายอื่นที่นี่: เป็นGETคำขอดังนั้นจึงไม่มีสิ่งใดที่จะเป็น "ยอมรับ" นั่นจะเป็นตัวเลือกที่สมเหตุสมผลหรือไม่

ทางเลือกที่ชัดเจนสำหรับสิ่งนี้ทั้งหมด - ฟังก์ชันใด แต่เอาชนะหนึ่งในวัตถุประสงค์ของรหัสสถานะ - จะรวมเมทาดาทาเสมอ:

200 OK

{
    status: "complete",
    data: {
        foo: "123"
    }
}

...หรือ...

200 OK

{
    status: "pending"
}

แล้วฝั่งไคลเอ็นต์ฉันจะ (ถอนหายใจ) switchในresponse.data.statusการตรวจสอบว่าการร้องขอเสร็จสมบูรณ์

นี่คือสิ่งที่ฉันควรจะทำอย่างไร หรือมีทางเลือกที่ดีกว่า นี่เป็นเพียงความรู้สึกของเว็บ 1.0 สำหรับฉัน


1
รหัส 1xx ไม่ได้ถูกสร้างขึ้นมาเพื่อจุดประสงค์นั้นหรือ
Andy

@Andy ฉันดูที่ 102 แต่สำหรับ WebDAV นอกเหนือจากนั้นไม่ ... ส่วนใหญ่ใช้สำหรับการสื่อสารระหว่างทาง มีประโยชน์ในการเปลี่ยนไปใช้ Web Sockets และอื่น ๆ
Matthew Haugen

คุณกำลังพูดเรื่องความล่าช้าอะไร 10 วินาที หรือ 6 ชั่วโมง หากความล่าช้านั้นสั้นและโดยทั่วไปอยู่ในการเยี่ยมชมเบราว์เซอร์เดียวกันคุณอาจทำการสำรวจแบบยาวหรือซ็อกเก็ตเว็บแทนการสำรวจความคิดเห็นเป็นระยะ
GrandmasterB

@GrandmasterB ถึงเวลาอาจเป็นไปได้ ฉันไม่รับผิดชอบต่อการประมวลผลงานเองดังนั้นฉันจึงไม่มีการประเมินที่ดีนัก แต่จะใช้เวลาสักพัก มิฉะนั้นฉันก็แค่ปล่อยให้POSTคำขอแรกที่เปิด ปัญหาหลักที่มีการทำโพลแบบยาวหรือเว็บซ็อกเก็ตคือผู้ใช้อาจปิดเบราว์เซอร์และกลับมา ฉันสามารถเปิดพวกเขาอีกครั้งในเวลานั้น (และนั่นคือสิ่งที่ฉันทำ) แต่ดูเหมือนว่าสะอาดกว่าที่จะมี API เดียวที่จะโทรหาก่อนที่ฉันจะเปิดซ็อกเก็ตเหล่านั้นเนื่องจากเป็นกรณีที่เกิดปัญหา
Matthew Haugen

คำตอบ:


48

ยอมรับ HTTP 202 (HTTP / 1.1)

คุณกำลังมองหาHTTP 202 Acceptedสถานะ ดูRFC 2616 :

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

การประมวลผล HTTP 102 (WebDAV)

RFC 2518แนะนำให้ใช้HTTP 102 Processing:

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

แต่มันมีข้อแม้:

เซิร์ฟเวอร์ต้องส่งคำตอบสุดท้ายหลังจากคำขอเสร็จสมบูรณ์

ฉันไม่แน่ใจว่าจะตีความประโยคสุดท้ายได้อย่างไร เซิร์ฟเวอร์ควรหลีกเลี่ยงการส่งสิ่งใดระหว่างการประมวลผลและตอบกลับหลังจากเสร็จสิ้นเท่านั้น หรือบังคับให้ยุติการตอบสนองก็ต่อเมื่อการประมวลผลสิ้นสุดลงเท่านั้น สิ่งนี้อาจมีประโยชน์หากคุณต้องการรายงานความคืบหน้า ส่ง HTTP 102 และล้างการตอบสนองไบต์โดยไบต์ (หรือทีละบรรทัด)

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

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

ปัญหาเกี่ยวกับการล้างข้อมูลแบบโปรเกรสซีฟ

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

วิธีที่ดีกว่าคือการตอบสนองHTTP 202 Acceptedและให้ผู้ใช้กลับไปหาคุณในภายหลังเพื่อตรวจสอบว่าการประมวลผลสิ้นสุดลงหรือไม่ (ตัวอย่างเช่นโดยการเรียก URI ที่กำหนดซ้ำ ๆ เช่น/process/resultจะตอบกลับด้วย HTTP 404 ไม่พบหรือHTTP 409 ขัดแย้งจนกว่ากระบวนการ เสร็จสิ้นและผลลัพธ์พร้อมแล้ว) หรือแจ้งผู้ใช้เมื่อดำเนินการเสร็จหากคุณสามารถโทรกลับไปหาลูกค้าผ่านบริการคิวข้อความ ( ตัวอย่าง ) หรือ WebSockets

ตัวอย่างการปฏิบัติ

ลองนึกภาพบริการเว็บที่แปลงวิดีโอ จุดเริ่มต้นคือ:

POST /video/convert

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

ลูกค้ามีความเป็นไปได้ที่จะสมัครสมาชิกคิวข้อความที่จะได้รับแจ้งเมื่อการประมวลผลเสร็จสิ้น เมื่อเสร็จแล้วลูกค้าสามารถดาวน์โหลดวิดีโอที่ประมวลผลได้โดยไปที่:

GET /video/download/123

HTTP 200ซึ่งนำไปสู่การ

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

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

ในกรณีนี้คุณสามารถใช้ปลายทางอื่น:

GET /video/status/123

ซึ่งจะส่งผลการตอบสนองเช่นนี้:

HTTP 200
{
    "id": 123,
    "status": "queued",
    "priority": 2,
    "progress-percent": 0,
    "submitted-utc-time": "2016-04-19T13:59:22"
}

การทำคำขอซ้ำแล้วซ้ำอีกจะแสดงความคืบหน้าจนกว่าจะถึง:

HTTP 200
{
    "id": 123,
    "status": "done",
    "progress-percent": 100,
    "submitted-utc-time": "2016-04-19T13:59:22"
}

สิ่งสำคัญคือการสร้างความแตกต่างระหว่างคำขอทั้งสามประเภท:

  • POST /video/convertจัดคิวงาน มันควรจะถูกเรียกเพียงครั้งเดียว: การเรียกมันอีกครั้งจะคิวงานเพิ่มเติม
  • GET /video/download/123เกี่ยวข้องกับผลลัพธ์ของการดำเนินการ: ทรัพยากรคือวิดีโอ การประมวลผล - นั่นคือสิ่งที่เกิดขึ้นภายใต้ประทุนเพื่อเตรียมผลลัพธ์ที่แท้จริงก่อนที่จะมีการร้องขอและเป็นอิสระต่อคำขอ - ไม่เกี่ยวข้องที่นี่ สามารถเรียกได้หนึ่งครั้งหรือหลายครั้ง
  • GET /video/status/123เกี่ยวข้องกับการประมวลผลตามลำดับ มันไม่ได้คิวอะไรเลย ไม่สนใจวิดีโอที่เกิดขึ้น ทรัพยากรคือการประมวลผลตัวเอง สามารถเรียกได้หนึ่งครั้งหรือหลายครั้ง

1
202 มีเหตุผลในการตอบสนองต่อ a GETหรือไม่? นั่นเป็นตัวเลือกที่ถูกต้องสำหรับการเริ่มต้นPOSTซึ่งเป็นเหตุผลที่ฉันใช้มัน แต่ดูเหมือนว่ามีความหมายที่น่าสงสัยสำหรับการที่GETจะพูดว่า "ยอมรับ" เมื่อไม่ได้รับอะไรจากคำขอนั้น
Matthew Haugen

2
@MainMa อย่างที่ฉันบอกว่าฉันPOSTทำงานที่จะเข้าคิวแล้วฉันGETผลลัพธ์ที่อาจเกิดขึ้นหลังจากที่ลูกค้าได้ปิดเซสชั่น 404 เป็นสิ่งที่ฉันได้รับการพิจารณาเช่นกัน แต่ดูเหมือนว่าผิดตั้งแต่การร้องขอจะพบมันก็ยังไม่เสร็จสมบูรณ์ นั่นจะบ่งบอกว่าฉันไม่พบงานที่อยู่ในคิวซึ่งเป็นสถานการณ์ที่แตกต่างกันมาก
Matthew Haugen

1
@MatthewHaugen: เมื่อคุณทำGETบางส่วนไม่ได้คิดเกี่ยวกับมันเป็นคำขอที่ไม่สมบูรณ์แต่เป็นคำขอที่จะได้รับผลของการดำเนินการ ตัวอย่างเช่นหากฉันบอกให้คุณแปลงวิดีโอและใช้เวลาห้านาทีในการทำวิดีโอการขอวิดีโอที่แปลงแล้วสองนาทีต่อมาควรส่งผลให้เป็น HTTP 404 เนื่องจากวิดีโอนั้นยังไม่มี ในทางกลับกันการร้องขอความคืบหน้าของการดำเนินการอาจส่งผลให้ HTTP 200 มีจำนวนไบต์ที่ถูกแปลงความเร็ว ฯลฯ
Arseni Mourzenko

5
รหัสสถานะ HTTP สำหรับทรัพยากรยังไม่พร้อมใช้งานแนะนำการส่งคืนการตอบสนองความขัดแย้ง 409 ("การร้องขอไม่สามารถเสร็จสมบูรณ์ได้เนื่องจากความขัดแย้งกับสถานะปัจจุบันของทรัพยากร") แทนที่จะเป็นการตอบสนอง 404 ในกรณีที่ทรัพยากรไม่ได้ ไม่มีอยู่เนื่องจากอยู่ระหว่างการสร้าง
ไบรอัน

1
@Brian ความคิดเห็นของคุณจะตอบคำถามนี้อย่างสมเหตุสมผล แม้ว่าฉันจะตอบกลับด้วย "[t] รหัสของเขาจะได้รับอนุญาตเฉพาะในสถานการณ์ที่คาดว่าผู้ใช้อาจสามารถแก้ไขข้อขัดแย้งและส่งคำขอซ้ำ" ซึ่งไม่เป็นความจริงในกรณีของฉัน แต่ดูเหมือนว่า ผิดน้อยกว่า "ไม่พบ" ส่วนหนึ่งของฉันกำลังมุ่งหน้าไปยัง 409 โดยมีส่วนหัว Retry-After ติดอยู่ ปัญหาเดียวคือมันดูเหมือนว่าแปลกที่จะคืน 409 สำหรับ GET แต่ฉันสามารถอยู่กับความแปลกประหลาดนั้น - มันไม่น่าจะเป็นอย่างอื่นที่กำหนดไว้ในอนาคต
Matthew Haugen

5

ทางเลือกที่ชัดเจนสำหรับสิ่งนี้ทั้งหมด - ฟังก์ชันใด แต่เอาชนะหนึ่งในวัตถุประสงค์ของรหัสสถานะ - จะรวมเมทาดาทาเสมอ:

นี่เป็นวิธีที่ถูกต้อง สถานะของทรัพยากรที่เกี่ยวข้องกับบันทึกเฉพาะโดเมน (หรือที่รู้จักกันในชื่อตรรกะทางธุรกิจ) เป็นเรื่องของประเภทเนื้อหาของการเป็นตัวแทนของทรัพยากร

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

จำรหัสสถานะ HTTP สอดคล้องกับการถ่ายโอนสถานะระหว่างไคลเอนต์และเซิร์ฟเวอร์ของทรัพยากรที่ถูกจัดการโดยอิสระกับรายละเอียดใด ๆ ของทรัพยากรนั้น เมื่อคุณGETเป็นทรัพยากรลูกค้าของคุณจะขอให้เซิร์ฟเวอร์สำหรับการเป็นตัวแทนของทรัพยากรในสถานะปัจจุบันมันเป็นสิ่งที่อาจเป็นภาพของนกมันอาจเป็นเอกสาร Word ก็อาจเป็นอุณหภูมิภายนอกปัจจุบัน โปรโตคอล HTTP ไม่สนใจ รหัสสถานะ HTTP สอดคล้องกับผลลัพธ์ของคำขอนั้น ไม่คิดPOSTจากลูกค้าไปยังเซิร์ฟเวอร์โอนทรัพยากรไปยังเซิร์ฟเวอร์ที่เซิร์ฟเวอร์แล้วให้มัน URL ที่ลูกค้าสามารถดู? ใช่? แล้วนั่นคือการ201 Createdตอบสนอง

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

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

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

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

หวังว่าจะช่วยชี้แจงสิ่งต่าง ๆ


"POST จากไคลเอนต์ไปยังเซิร์ฟเวอร์ถ่ายโอนทรัพยากรไปยังเซิร์ฟเวอร์ที่เซิร์ฟเวอร์ให้ URL ที่ลูกค้าสามารถดูได้หรือไม่ใช่แล้วนั่นคือการตอบสนองที่สร้างขึ้น 201 รายการ" 202 ยอมรับเป็นที่ยอมรับเช่นกันหากเซิร์ฟเวอร์ไม่สามารถดำเนินการได้ทันทีเพื่อประมวลผลทรัพยากรซึ่งเป็นสิ่งที่ OP กำลังทำอยู่
Andy

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

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

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

4

ผมพบว่าข้อเสนอแนะจากบล็อกนี้เหมาะสม: REST และงานยาวทำงาน

เพื่อสรุป:

  1. เซิร์ฟเวอร์ส่งคืนรหัส "202 ยอมรับแล้ว" โดยตั้งค่าส่วนหัว "ตำแหน่ง" เป็น URI เพื่อให้ลูกค้าตรวจสอบสถานะเช่น "/ queue / 12345"
  2. จนกว่าการประมวลผลจะเสร็จสิ้นเซิร์ฟเวอร์จะตอบกลับการสอบถามสถานะด้วย "200 OK" และข้อมูลการตอบกลับบางส่วนแสดงสถานะงาน
  3. หลังจากการประมวลผลเสร็จสิ้นเซิร์ฟเวอร์จะตอบกลับการสอบถามสถานะด้วย "303 ดูอื่น ๆ " และ "ตำแหน่ง" ที่มี URI เพื่อผลลัพธ์สุดท้าย

2

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

จากข้อมูลจำเพาะของ w3 :

10.4.10 409 ความขัดแย้ง

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

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

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

นี่เป็นเรื่องที่น่าอึดอัดใจเล็กน้อยเนื่องจากรหัส 409 เป็น "อนุญาตเฉพาะในสถานการณ์ที่คาดว่าผู้ใช้จะสามารถแก้ไขข้อขัดแย้งและส่งคำขอได้อีกครั้ง" ฉันขอแนะนำให้เนื้อหาการตอบกลับมีข้อความ (อาจเป็นรูปแบบการตอบสนองที่ตรงกับส่วนที่เหลือของ API ของคุณ) เช่น "ทรัพยากรนี้กำลังถูกสร้างขึ้นมันเริ่มต้นที่ [TIME] และคาดว่าจะเสร็จสมบูรณ์ในเวลา [TIME] ลองอีกครั้งในภายหลัง "

โปรดทราบว่าฉันจะแนะนำ 409 แนวทางเท่านั้นหากมีความเป็นไปได้สูงว่าผู้ใช้ที่ร้องขอทรัพยากรเป็นผู้ใช้ที่เริ่มต้นการสร้างทรัพยากรนั้นด้วย ผู้ใช้ที่ไม่เกี่ยวข้องกับการสร้างทรัพยากรจะพบข้อผิดพลาด 404 ที่ทำให้เกิดความสับสนน้อยลง


ดูเหมือนว่าสิ่งที่มีความหมาย 409 จริง ๆ ซึ่งเป็นที่ตอบสนองต่อการวาง
Andy

@Andy: จริง แต่ก็เป็นทางเลือกอื่น ๆ เช่น 202 มีขึ้นเพื่อตอบสนองต่อคำขอที่เริ่มต้นการประมวลผลไม่ใช่คำขอที่ร้องขอผลลัพธ์ของการประมวลผล จริง ๆ แล้วการตอบสนองที่ตรงตามข้อกำหนดมากที่สุดคือ 404 เนื่องจากไม่พบทรัพยากร (เพราะยังไม่มี) ไม่มีอะไรหยุด API จากการให้ข้อมูล api ที่เกี่ยวข้องภายในการตอบสนอง 404 ในใจคุณการตอบกลับ 4xx / 5xx มักจะน่ารำคาญที่จะบริโภค บางภาษาจะทำการยกเว้นยกเว้นเพียงแค่ระบุรหัสสถานะอื่น
Brian

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