รหัสสถานะ HTTP ที่ถูกต้องกับอินพุตที่ไม่ถูกต้อง


169

รหัสตอบกลับ HTTP ที่ดีที่สุดคืออะไรเมื่อไม่รายงาน 200 (ทุกอย่างตกลง) แต่เกิดข้อผิดพลาดในการป้อนข้อมูล

เช่นเดียวกับที่คุณส่งข้อมูลไปยังเซิร์ฟเวอร์และจะตอบกลับว่าข้อมูลของคุณไม่ถูกต้อง

การใช้500ดูเหมือนกับปัญหาของเซิร์ฟเวอร์ที่
ใช้200กับข้อความเตือน / ตอบกลับข้อผิดพลาดไม่ดี (การอนุญาตให้ใช้แคชและทุกอย่างไม่เป็นไร) การ
ใช้งาน204และไม่ส่งคืนอะไรอาจจะดี (แต่ได้รับการสนับสนุนอย่างดี?)
โดยใช้404ผิด ในสถานที่ที่เหมาะสม


ดูคำตอบของฉันสำหรับรายละเอียดstackoverflow.com/a/59527615/4127230
shiva2492

คำตอบ:


210

เรามีปัญหาเดียวกันเมื่อสร้าง API ของเราเช่นกัน เรากำลังมองหารหัสสถานะ HTTP InvalidArgumentExceptionเทียบเท่ากับ หลังจากอ่านบทความต้นฉบับด้านล่างเราได้ใช้422 Unprocessable Entityสถานะที่:

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

แหล่งที่มา: https://www.bennadel.com/blog/2434-http-status-codes-for-invalid-data-400-vs-422.htm


138

รหัสที่ขึ้นต้นด้วย 4 (4xx) นั้นมีไว้สำหรับข้อผิดพลาดของลูกค้า บางที 400 (คำขอที่ไม่ดี) อาจเหมาะกับกรณีนี้หรือไม่ คำจำกัดความในhttp://www.w3.org/Protocols/rfc2616/rfc2616-sec10.htmlพูดว่า:

"เซิร์ฟเวอร์ไม่สามารถเข้าใจคำขอได้เนื่องจากไวยากรณ์ผิดรูปแบบไคลเอ็นต์ไม่ควรทำซ้ำการร้องขอโดยไม่มีการแก้ไข"


13
400 Bad Requestไม่เลว แต่โดยทั่วไปควรจะสงวนไว้สำหรับไวยากรณ์ที่มีรูปแบบไม่ถูกต้อง OP ดูเหมือนจะกังวลมากขึ้นเกี่ยวกับกรณีที่มีรูปแบบที่ดี แต่ค่าไม่ถูกต้อง บวก 400 เป็นรหัสการตอบสนอง "ผิดปกติบางอย่างไม่ถูกต้อง" ซึ่งคุณอาจต้องการแยกความแตกต่างจากกรณีที่มีการป้อนข้อมูลผิดพลาด
Keego

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

14

นอกจากRFC Spec แล้ว คุณยังสามารถเห็นการทำงานนี้ ลองดูคำตอบจากทวิตเตอร์

https://developer.twitter.com/en/docs/ads/general/guides/response-codes


19
คุณอาจได้รับ upvotes มากขึ้นถ้าคุณดึงตัวอย่างจากลิงก์ของคุณ
Jared Thirsk

ฉันได้ยกตัวอย่างในโพสต์stackoverflow.com/a/59527615/4127230
shiva2492

1
สำหรับฉันลิงก์ ( fb-developers.info/tech/fb_dev/faq/general/gen_10.html ) นำไปสู่โฆษณาแบบสุ่ม ฉันคิดว่าโดเมนถูกปลอมแปลง
dmitry502

@ dmitry502 ตอบแล้วมีการแก้ไขเพื่อลบลิงค์ปลอมแปลง ขอบคุณสำหรับความคิดเห็นของคุณ
ฟรานซิส

9

409 Conflict อาจเป็นทางออกที่ยอมรับได้

ตามที่: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

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

เอกสารดำเนินการต่อด้วยตัวอย่าง:

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


ในกรณีของฉันฉันต้องการใส่สตริงที่ต้องไม่ซ้ำกันกับฐานข้อมูลผ่าน API ก่อนที่จะเพิ่มลงในฐานข้อมูลฉันกำลังตรวจสอบว่ามันไม่ได้อยู่ในฐานข้อมูล

"Error: The string is already in the database", 409ถ้าเป็นผมจะกลับมา

ฉันเชื่อว่านี่คือสิ่งที่ OP ต้องการ: รหัสข้อผิดพลาดที่เหมาะสมเมื่อข้อมูลไม่ผ่านเกณฑ์ของเซิร์ฟเวอร์


2

ตามสถานการณ์ด้านล่าง

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

จนถึงตอนนี้ฉันจะคืน "400 คำขอไม่ถูกต้อง" ซึ่งตาม w3.org หมายถึง:

เซิร์ฟเวอร์ไม่สามารถเข้าใจการร้องขอได้เนื่องจากไวยากรณ์ผิดรูปแบบ ลูกค้าไม่ควรทำซ้ำการร้องขอโดยไม่มีการดัดแปลง

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

อย่างไรก็ตามเมื่อเร็ว ๆ นี้มีคนจากทีม Dev ของฉันชี้ให้เห็นว่า [API] ที่เป็นที่นิยมนั้นกำลังเริ่มใช้ส่วนขยาย HTTP เพื่อรับข้อมูลที่ละเอียดยิ่งขึ้นด้วยการรายงานข้อผิดพลาดที่ละเอียดยิ่งขึ้น โดยเฉพาะอย่างยิ่ง APIs จำนวนมากเช่น Twitter และ Recurly กำลังใช้รหัสสถานะ "422 Unprocessable Entity" ตามที่กำหนดไว้ในส่วนขยาย HTTP สำหรับ WebDAV รหัสสถานะ HTTP 422 สถานะ:

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

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


-7

404 - ไม่พบ - สามารถใช้สำหรับ URI ที่ร้องขอไม่ถูกต้องหรือทรัพยากรที่ร้องขอเช่นผู้ใช้ไม่มีอยู่


2
OP ได้ตัดสินว่า: "การใช้ 404 นั้นผิดถ้าเส้นทางที่ต้องการ (สคริปต์) พร้อมใช้งานและอยู่ในตำแหน่งที่เหมาะสม "
Remy Lebeau
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.