ข้อผิดพลาด REST API คืนแนวทางปฏิบัติที่ดี [ปิด]


623

ฉันกำลังมองหาคำแนะนำเกี่ยวกับแนวทางปฏิบัติที่ดีเมื่อต้องส่งคืนข้อผิดพลาดจาก REST API ฉันกำลังทำงานกับ API ใหม่เพื่อให้ฉันสามารถทิศทางใดก็ได้ในขณะนี้ ประเภทเนื้อหาของฉันคือ XML ในขณะนี้ แต่ฉันวางแผนที่จะสนับสนุน JSON ในอนาคต

ตอนนี้ฉันกำลังเพิ่มข้อผิดพลาดบางอย่างเช่นลูกค้าพยายามเพิ่มทรัพยากรใหม่ แต่มีโควต้าการจัดเก็บข้อมูลเกิน ฉันกำลังจัดการกรณีข้อผิดพลาดบางอย่างด้วยรหัสสถานะ HTTP (401 สำหรับการตรวจสอบสิทธิ์, 403 สำหรับการให้สิทธิ์และ 404 สำหรับคำขอที่ไม่ดีธรรมดา) ฉันตรวจดูรหัสข้อผิดพลาด HTTP ที่มีความสุข แต่ไม่มีช่วง 400-417 ที่ดูเหมือนจะถูกรายงานข้อผิดพลาดเฉพาะแอปพลิเคชัน ดังนั้นในตอนแรกฉันถูกล่อลวงให้ส่งคืนข้อผิดพลาดแอปพลิเคชันของฉันด้วย 200 OK และ XML ที่ระบุเฉพาะ (เช่นจ่ายเงินให้เรามากขึ้นและคุณจะได้รับพื้นที่เก็บข้อมูลที่คุณต้องการ!) แต่ฉันหยุดคิดเกี่ยวกับมัน ยักด้วยความกลัว) นอกจากนี้ฉันรู้สึกว่าฉันแบ่งการตอบสนองข้อผิดพลาดออกเป็นกรณีที่แตกต่างกันเนื่องจากบางรายการเป็นรหัสสถานะ HTTP ที่ขับเคลื่อนด้วยและอื่น ๆ เป็นเนื้อหาที่ขับเคลื่อน

ดังนั้นคำแนะนำอุตสาหกรรมคืออะไร? แนวทางปฏิบัติที่ดี (โปรดอธิบายว่าทำไม!) และจากลูกค้า POV การจัดการข้อผิดพลาดประเภทใดใน REST API ทำให้ชีวิตของรหัสลูกค้าง่ายขึ้น?


7
เพื่อชี้แจง: ฉันไม่สนใจว่ารหัสสถานะ HTTP ใดที่จะส่งคืน แต่เป็นวิธีปฏิบัติที่ดีในการรวมข้อผิดพลาดของการโหลดกับรหัสสถานะ HTTP หรือดีกว่าที่จะพึ่งพา แต่เพียงผู้เดียว
Remus Rusanu

3
คู่มือการออกแบบ REST APIครอบคลุมหัวข้อนี้ค่อนข้างดี
Remus Rusanu

12
คำถามไม่ได้ขอความเห็น แต่เป็นแนวทาง / คำแนะนำและควรจะเปิดใหม่และใช้เป็นข้อมูลอ้างอิง อะไรคือประเด็นที่จะปิดในปี 2016 คำถามที่สร้างขึ้นในปี 2009 มีคะแนนโหวต 400+ และไม่มีคำตอบที่มีอยู่บนพื้นฐานของความคิดเห็น
Michael Freidgeim

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

คำตอบ:


220

ดังนั้นในตอนแรกฉันถูกล่อลวงให้ส่งคืนข้อผิดพลาดแอปพลิเคชันของฉันด้วย 200 OK และ XML ที่ระบุเฉพาะ (เช่นจ่ายเงินให้เรามากขึ้นและคุณจะได้รับพื้นที่เก็บข้อมูลที่คุณต้องการ!) แต่ฉันหยุดคิดเกี่ยวกับมัน ยักด้วยความกลัว)

ฉันจะไม่คืน 200 ถ้าไม่มีอะไรผิดปกติกับคำขอ จากRFC2616 , 200 หมายถึง "คำขอประสบความสำเร็จ"

หากเกินโควต้าการจัดเก็บของลูกค้า (ด้วยเหตุผลใดก็ตาม) ฉันจะส่งคืน 403 (ต้องห้าม):

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

สิ่งนี้บอกลูกค้าว่าคำขอนั้นตกลง แต่ล้มเหลว (บางอย่างที่ 200 ไม่ทำ) สิ่งนี้ยังให้โอกาสคุณในการอธิบายปัญหา (และวิธีแก้ปัญหา) ในส่วนการตอบกลับ

คุณมีเงื่อนไขข้อผิดพลาดอื่นใดอีกบ้าง


6
ฉันควรจะรวมข้อความแสดงข้อผิดพลาดโดยละเอียดไว้ในเนื้อความเช่น รหัส XML / คู่สตริง? ลูกค้าจะรับมือกับสิ่งนี้ได้อย่างไร เช่นฉันรู้ว่า C # WebRequest ลูกค้าจะโยน 'คำขอไม่ดี' หรือ 'ต้องห้าม' และไม่ให้เนื้อหาตอบกลับ
Remus Rusanu

18
เนื้อหาของ 403 "ควร" มีรายละเอียดของข้อผิดพลาด ไม่ว่าลูกค้าจะพร้อมที่จะใช้ข้อมูลเป็นอีกเรื่องหนึ่ง มันสมเหตุสมผลที่สุดสำหรับรูปแบบนี้เหมือนกับรูปแบบสำหรับ payloads อื่น ๆ ทั้งหมด (เช่น XML, JSON)
Apodaca รวย

1
... และหากรายละเอียดไม่ได้ถูกส่งคืนใน 403 เราสามารถใช้ 404 "แทนได้ (ดูเหมือนจะไม่ใช่ตัวเลือกที่ดีที่สุดสำหรับฉัน)
รวย Apodaca

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

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

584

แหล่งข้อมูลที่ดีในการเลือกรหัสข้อผิดพลาด HTTP ที่ถูกต้องสำหรับ API ของคุณ: http://www.codetinkerer.com/2015/12/04/choosing-an-http-status-code.html

ข้อความที่ตัดตอนมาจากบทความ:

เริ่มต้นที่ไหน:

ป้อนคำอธิบายรูปภาพที่นี่

2XX / 3xx:

ป้อนคำอธิบายรูปภาพที่นี่

4XX:

ป้อนคำอธิบายรูปภาพที่นี่

5XX:

ป้อนคำอธิบายรูปภาพที่นี่


1
422 เป็นส่วนขยาย WebDAV โดยเฉพาะ ฉันคิดว่าไม่ควรอยู่ที่นี่
Mario

@Mario มันเป็นสำนวนใน Ruby on Rails API เพื่อกลับ 422 ตามเงื่อนไขที่ระบุที่นี่ การติดตามที่ดีมากมายนั้นได้ทำไปแล้ว คุณจะแทนที่การใช้ 422 เพื่อทำอะไร
Kelsey Hannan

Regular 400 ธรรมดา
Andbdrew

ขอบคุณ. หมายความว่า "คุณกำลังโกรธอินเทอร์เน็ตเลิก?"?
RoutesMaps.com


87

ตัวเลือกหลักคือคุณต้องการใช้รหัสสถานะ HTTP เป็นส่วนหนึ่งของ REST API หรือไม่

ทั้งสองวิธีทำงานได้ดี ฉันยอมรับว่าหนึ่งในแนวคิดของ REST อย่างเคร่งครัดคือคุณควรใช้รหัสสถานะ HTTP เป็นส่วนหนึ่งของ API ของคุณ (คืน 200 หรือ 201 สำหรับการดำเนินการที่ประสบความสำเร็จและ 4xx หรือ 5xx ขึ้นอยู่กับกรณีข้อผิดพลาดต่างๆ) อย่างไรก็ตาม ไม่มีตำรวจ REST คุณสามารถทำสิ่งที่คุณต้องการ. ฉันได้เห็น API ที่ไม่ใช่ REST ที่ยิ่งใหญ่กว่าที่เรียกว่า "RESTful"

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

รหัสสถานะ HTTP เป็นส่วนหนึ่งของ API ของคุณ

  1. คุณจะต้องเลือกรหัส 4xx ที่เหมาะสมกับเงื่อนไขข้อผิดพลาดของคุณ คุณสามารถรวมข้อความที่เหลือ xml หรือข้อความธรรมดาเป็นเพย์โหลดที่มีรหัสย่อยและความคิดเห็นเชิงอธิบาย

  2. ลูกค้าจะต้องใช้ซอฟต์แวร์ที่ช่วยให้พวกเขาได้รับรหัสสถานะระดับ HTTP มักจะทำไม่ได้เสมอไปข้างหน้า

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

รหัสสถานะ HTTP ไม่ได้เป็นส่วนหนึ่งของ API ของคุณ

  1. รหัสสถานะ HTTP จะเป็น 200 หากแอปของคุณได้รับคำขอจากนั้นตอบกลับ (ทั้งกรณีความสำเร็จและข้อผิดพลาด)

  2. คำตอบทั้งหมดของคุณควรมีข้อมูล "ซองจดหมาย" หรือ "ส่วนหัว" โดยทั่วไปแล้วสิ่งที่ชอบ:

    envelope_ver: 1.0
    สถานะ: # ใช้รหัสใด ๆ ที่คุณชอบ จองรหัสเพื่อความสำเร็จ
    msg: "ok" # สตริงมนุษย์ที่แสดงรหัส มีประโยชน์สำหรับการดีบัก
    data: ... # ข้อมูลการตอบกลับหากมี
  3. วิธีการนี้สามารถทำได้ง่ายขึ้นสำหรับลูกค้าเนื่องจากสถานะสำหรับการตอบสนองอยู่ในสถานที่เดียวกันเสมอ (ไม่จำเป็นต้องใช้รหัสย่อย) ไม่ จำกัด รหัสไม่จำเป็นต้องดึงสถานะ HTTP ระดับรหัส

นี่คือโพสต์ที่มีแนวคิดคล้ายกัน: http://yuiblog.com/blog/2008/10/15/datatable-260-part-one/

ประเด็นหลัก:

  1. ตรวจสอบให้แน่ใจว่าได้ใส่หมายเลขเวอร์ชันเพื่อให้คุณสามารถเปลี่ยนซีแมนทิกส์ของ API ได้ในภายหลังหากจำเป็น

  2. เอกสาร...


8
ไท ตัวเลือกที่ 2 ดูเหมือนว่าสบู่ในเสื้อผ้าที่เหลือ ...
Remus Rusanu

138
ไม่การขุดทุกอย่างผ่าน 200 ไม่ได้เป็นการพักผ่อนเลย มันจะป้องกันไม่ให้ตัวกลางเข้าใจผลของการดำเนินการซึ่งจะฆ่ารูปแบบของการแคชใด ๆ ซ่อนความหมายของการดำเนินการและกำหนดความเข้าใจเนื้อหาของข้อความเพื่อประมวลผลข้อผิดพลาดละเมิดข้อ จำกัด ข้อความที่มีอยู่ในตัว
SerialSeb

13
การส่งกลับรายละเอียดข้อผิดพลาดที่มี 200 อาจไม่สงบ แต่นี่เป็นคำตอบที่มีประโยชน์อย่างไรก็ตาม (ถ้าคุณเพิกเฉยต่อคำพูด "ทั้งสองวิธีเงียบ") ... จุดที่ใหญ่กว่าอาจเป็นว่า RESTful API อาจไม่ใช่ตัวเลือกที่ดีที่สุดสำหรับ OP
MB

3
ดูเหมือนว่าจะมีความเข้าใจโดยทั่วไปว่าคุณสามารถทำสิ่งที่คุณต้องการด้วยโปรโตคอล HTTP และยังคงเป็น "RESTy" ซึ่งเป็นเท็จ ใช้โปรโตคอลสำหรับสิ่งที่เขียนนั่นเป็นหนึ่งในแนวคิดหลักของ REST ดังนั้นรหัสสถานะจะต้องเป็นส่วนหนึ่งของโปรโตคอลของคุณ
Ariel M.

จุดของรหัสสถานะคือการให้ภาษาทั่วไปของความเข้าใจระหว่างภาษาการเขียนโปรแกรมกรอบและวิธีการที่หลากหลาย ความหมายของรหัสสถานะใกล้เคียงกับความเป็นสากล: เนื้อหาที่คุณกำหนดเอง - ซึ่งเพิ่มความซับซ้อนมากขึ้นโดยทางไวยากรณ์แบบกำหนดเองที่ผู้ใช้ API ของคุณต้องเรียนรู้ - ไม่ใช่
Kelsey Hannan

40

โปรดจำไว้ว่ามีรหัสสถานะมากขึ้นกว่าที่กำหนดไว้ใน HTTP / 1.1 RFCs รีจิสทรี IANA ที่http://www.iana.org/assignments/http-status-codes สำหรับกรณีที่คุณกล่าวถึงรหัสสถานะ 507 เสียงถูกต้อง


3
อืมในขณะที่ภาพรวม "507 Insufficient Storage" ดูเหมือนว่ามันอาจจะเหมาะสมฉันจะใช้มันเพราะมันตั้งใจจะเป็นส่วนขยาย WebDAV (ค่อนข้างเจาะจง) และไม่ใช่แบบทั่วไป "เฮ้คุณออกจากพื้นที่" ข้อยกเว้น ถึงกระนั้นฉันคิดว่าคุณสามารถใช้มัน
Max

1
ไม่มันไม่ได้เป็น WebDAV เฉพาะเลย มีสาเหตุที่มีรีจิสทรีสำหรับรหัสสถานะ HTTP
Julian Reschke

25
ฉันไม่เห็นด้วยกับ507วัตถุประสงค์นี้ การตีความของฉัน507คือเซิร์ฟเวอร์ไม่ว่างไม่ใช่ว่าบัญชีไม่มีพื้นที่
Patrick

11
ฉันเห็นด้วยกับแพทริค 5xxข้อผิดพลาดสำหรับข้อผิดพลาดจะทำอย่างไรกับเซิร์ฟเวอร์
ฌอน

10
418: "ฉันเป็นกาน้ำชา" หมายความว่าพื้นที่เก็บข้อมูลน้อยเกินไป (เช่นกาน้ำชามีขนาดเล็ก) มากกว่าที่จะเป็นใหญ่
Steve Konves

22

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

โปรดจำไว้ว่าข้อผิดพลาด 5xx เป็นฝั่งเซิร์ฟเวอร์หรือที่ลูกค้าไม่สามารถเปลี่ยนสิ่งใดเป็นคำขอของตนเพื่อส่งคำขอ หากเกินโควต้าของลูกค้านั่นไม่ใช่ข้อผิดพลาดเซิร์ฟเวอร์แน่นอนดังนั้นควรหลีกเลี่ยง 5xx


ฉันจะไม่เห็นด้วย โควต้าเกินจะเป็นข้อผิดพลาดเซิร์ฟเวอร์ (5xx) เพราะ: คำขอของลูกค้าที่ถูกต้องและจะได้รับความสำเร็จถ้าภายใต้โควต้าซึ่งออกกฎ 400series
mikek3332002

3
แต่เซิร์ฟเวอร์ไม่ได้ทำอะไรผิด
Charlie Schliesser

20

มีข้อผิดพลาดสองประเภท ข้อผิดพลาดของแอปพลิเคชันและข้อผิดพลาด HTTP ข้อผิดพลาด HTTP เป็นเพียงเพื่อให้ตัวจัดการ AJAX ของคุณรู้ว่าสิ่งต่าง ๆ ดีและไม่ควรใช้เพื่อสิ่งอื่น

5xx เซิร์ฟเวอร์ผิดพลาด

500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported
506 Variant Also Negotiates (RFC 2295 )
507 Insufficient Storage (WebDAV) (RFC 4918 )
509 Bandwidth Limit Exceeded (Apache bw/limited extension)
510 Not Extended (RFC 2774 )

สำเร็จ 2xx

200 OK
201 Created
202 Accepted
203 Non-Authoritative Information (since HTTP/1.1)
204 No Content
205 Reset Content
206 Partial Content
207 Multi-Status (WebDAV)

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


1
400 ยังเป็นประโยชน์ในการระบุปัญหาในแอปพลิเคชันไคลเอนต์
dolmen

19

ฉันรู้ว่านี่มันช้าไปมากสำหรับงานปาร์ตี้ แต่ตอนนี้ในปี 2013 เรามีสื่อบางประเภทที่จะครอบคลุมการจัดการข้อผิดพลาดในแฟชั่นแบบกระจาย (RESTful) ทั่วไป ดู "vnd.error", application / vnd.error + json ( https://github.com/blongden/vnd.error ) และ "รายละเอียดปัญหาสำหรับ HTTP APIs", application / problem + json ( https: // tools ietf.org/html/draft-nottingham-http-problem-05 )


2
ขอบคุณสำหรับลิงค์ draft-nottingham-http- problems
seanf

9

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

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


3
ไม่ว่าคุณจะมีการตอบสนองที่ประสบความสำเร็จหรือการตอบสนองความล้มเหลวคุณอาจจะแยกการตอบสนอง หากเป็นข้อผิดพลาดคุณต้องการแยกวิเคราะห์เพื่อรับข้อความแสดงข้อผิดพลาด การตอบสนองข้อผิดพลาดโดยทั่วไปจะมีขนาดเล็กและรวดเร็วในการแยกวิเคราะห์ ฉันไม่คิดว่าเราควรกังวลเกี่ยวกับการพยายามเพิ่มประสิทธิภาพเพื่อหลีกเลี่ยงการแยกวิเคราะห์คำตอบ คุณจะทิ้งการตอบสนองข้อผิดพลาดโดยไม่แยกวิเคราะห์หรือไม่? ไม่ฉลาดในความคิดของฉัน
AgilePro

3
หากคุณได้รับ 200 OK คุณอาจเลือกที่จะไม่แยกวิเคราะห์ได้เช่นกันทั้งนี้ขึ้นอยู่กับกฎเกณฑ์ทางธุรกิจของคุณ ประเด็นคือไม่ว่าเราแยกวิเคราะห์มันตลอดเวลาหรือไม่ ประเด็นก็คือเจตนา - เจตนาของ 200 ตกลงคืออะไร? คุณกำลังทำลายเจตนาโดยการส่งข้อความแสดงข้อผิดพลาดที่ห่อหุ้มใน 200 OK
Kingz

1
"เจตนาของ 200 OK คืออะไร" - ระบุความสำเร็จของเลเยอร์การขนส่ง ได้รับคำขอและตอบรับเรียบร้อยแล้วมีเพียงปัญหาเฉพาะแอปพลิเคชันซึ่งไม่มีส่วนเกี่ยวข้องกับ HTTP +++ ใส่รอบวิธีอื่น ๆ : การส่ง 404 หมายถึงส่วนที่เหลือของโลกที่บางสิ่งบางอย่างไม่พบอาจ URL ที่เป็นสิ่งที่ผิดธรรมดาหรือทรัพยากรที่ต้องดำเนินการหรือสิ่งอื่นที่ไม่พบ หากไม่แยกวิเคราะห์ข้อความคุณจะทำไม่ได้ IMHO REST เป็นเพียงการทำให้เลเยอร์สับสน
maaartinus

Conflation เป็นบรรทัดฐาน มันมีไวยากรณ์ในการจัดการที่เหมาะสมกับสายการให้เหตุผลของคุณและช่วยให้คุณมุ่งเน้นไปที่ชั้นธุรกิจ เห็นด้วยกับการขนส่งสถานะในภายหลัง comms - นั่นคือสิ่งที่เป็นวัตถุประสงค์ในสถานที่แรก - ส่วนที่ไม่ได้คิดค้น / เสนอพร้อมกันกับ HTTP - มันมาในภายหลังและก็ตัดสินใจที่จะใช้โครงสร้างพื้นฐานที่มีอยู่เพื่อเป็นตัวแทนของรัฐและการเปลี่ยนแปลง
Kingz

6

การสร้างแบบจำลอง API ของคุณใน 'การปฏิบัติที่ดีที่สุด' ที่มีอยู่อาจเป็นวิธีที่จะไป ตัวอย่างเช่นนี่คือวิธีที่ Twitter จัดการกับรหัสข้อผิดพลาด https://developer.twitter.com/en/docs/basics/response-codes


5

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


3

อย่าลืมข้อผิดพลาด 5xx เช่นกันสำหรับข้อผิดพลาดของแอปพลิเคชัน

ในกรณีนี้ประมาณ 409 (ความขัดแย้ง) คืออะไร? นี่ถือว่าผู้ใช้สามารถแก้ไขปัญหาได้โดยการลบทรัพยากรที่เก็บไว้

มิฉะนั้น 507 (ไม่ใช่มาตรฐานทั้งหมด) อาจใช้งานได้เช่นกัน ฉันจะไม่ใช้ 200 ยกเว้นว่าคุณใช้ 200 เพื่อหาข้อผิดพลาดโดยทั่วไป


-1

หากเกินโควต้าของลูกค้านั่นเป็นข้อผิดพลาดของเซิร์ฟเวอร์ให้หลีกเลี่ยง 5xx ในอินสแตนซ์นี้


2
ทำไมหลีกเลี่ยงข้อผิดพลาด 5xx series เมื่อข้อผิดพลาดเซิร์ฟเวอร์?
mikek3332002

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