REST API 404: URI ไม่ดีหรือทรัพยากรหายไป


219

ฉันกำลังสร้าง REST API แต่ฉันพบปัญหา

ดูเหมือนว่าวิธีปฏิบัติที่ได้รับการยอมรับในการออกแบบ REST API ก็คือถ้าทรัพยากรที่ร้องขอไม่มีอยู่จะมีการส่งคืน 404

อย่างไรก็ตามสำหรับฉันมันเพิ่มความกำกวมที่ไม่จำเป็น HTTP 404 นั้นเชื่อมโยงกับ URI ที่ไม่ดีมากกว่าเดิม ดังนั้นในความเป็นจริงเรากำลังพูดว่า"ไม่ว่าคุณจะถูกที่ แต่ไม่มีบันทึกที่เฉพาะเจาะจงหรือไม่มีตำแหน่งดังกล่าวใน Internets! ฉันไม่แน่ใจว่าที่หนึ่ง ... "

พิจารณา URI ต่อไปนี้:

http://mywebsite/api/user/13

หากฉันได้รับ 404 กลับมานั่นเป็นเพราะผู้ใช้ 13 ไม่มีอยู่หรือไม่ หรือเป็นเพราะ URL ของฉันควรเป็น:

http://mywebsite/restapi/user/13

ก่อนหน้านี้ฉันเพิ่งส่งคืนผลลัพธ์ NULL พร้อมHTTP 200 OKรหัสตอบกลับหากไม่มีระเบียน มันง่ายและในความคิดของฉันสะอาดมากถึงแม้ว่ามันจะไม่ได้รับการปฏิบัติที่จำเป็น แต่มีวิธีที่ดีกว่าในการทำเช่นนี้?



7
คำถามอื่น ๆ ดูเหมือนจะเกี่ยวข้องกับรูปแบบสตริง URI การอภิปรายเกี่ยวกับ 404 นั้นไม่เพียงพอที่จะตอบคำถามของฉันซึ่งก็คือว่ามีวิธีที่เหมาะสมหรือมีประโยชน์มากขึ้นในการพิจารณาว่า 404 หมายถึงอะไรจริง ๆ ฉันตรวจสอบมันก่อนโพสต์
— Brian Lacy

เป็นเรื่องปกติหรือไม่เมื่อ Concole ของเบราว์เซอร์มีข้อผิดพลาด 404 เมื่อฉันทำการดำเนินการปกติกับ uri ที่ถูกต้อง แต่ไม่พบทรัพยากร
— Vasiliy Mazhekin

3
404 ไม่ได้ระบุ URI ที่ไม่ถูกต้อง แต่เป็นการระบุว่าทรัพยากรไม่พบ อาจเป็นเพราะไม่มีผู้ใช้ '13' หรืออาจเป็นเพราะไม่มีทรัพยากร / mywebsite / api
— ChrisV

คำตอบ:


101

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


7
มันสมเหตุสมผลแล้ว ฉันต้องสงสัยว่าแม้ว่าผลประโยชน์ใด ๆ จะได้รับจริง ๆ จากการคืน 404 ในตอนแรกเทียบกับการคืนค่า 200 ด้วยการตอบกลับเป็นค่าว่างหรือไม่
— Brian Lacy

15
ถ้าคุณคืนค่า 200 ด้วยค่า Null คุณกำลังใช้ HTTP Spec คุณสามารถทำสิ่งนี้ได้ แต่จากนั้น API ของคุณจะไม่ปฏิบัติตามข้อ จำกัด "อินเตอร์เฟสแบบอินเทอร์เฟซ" ของ REST
— ฟ้อง

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

@DarrylHebbes คุณหมายถึงอะไรฉันสามารถทำคำขอและดูเนื้อหาทั้งหมดของการตอบสนองในแท็บเครือข่ายของคอนโซลนักพัฒนาซอฟต์แวร์ Chrome
— jaapz

มันไม่ดีอย่างเหลือเชื่อที่จะส่งกลับข้อผิดพลาด (404 หรืออะไรก็ตาม) สำหรับแบบสอบถามใด ๆ ที่ส่งคืนผลลัพธ์ที่ว่างเปล่า ฐานข้อมูลจะไม่ทำเช่นนั้นและโดยปกติแล้วคุณไม่ต้องการรายงานผลลัพธ์ว่างเปล่าเป็นเงื่อนไขที่ไม่คาดคิดกับผู้ใช้ ตัวอย่าง: คุณสอบถาม API ของคุณเพื่อตรวจสอบว่ามีการนัดหมายที่กำหนดไว้ในอีก 30 นาทีหรือไม่ หากไม่มีคุณไม่ควรส่งคืน 404 ส่งคืน 200 OK และอาร์เรย์ว่างเปล่าโปรด
— esmiralha

59

ใช้404หากไม่มีทรัพยากร อย่ากลับ200ด้วยร่างกายที่ว่างเปล่า

นี่คือคล้ายกับundefinedvs สตริงว่าง (เช่น"") ในการเขียนโปรแกรม ในขณะที่คล้ายกันมากมีความแตกต่างอย่างแน่นอน

404หมายความว่าไม่มีสิ่งใดใน URI นั้น (เช่นตัวแปรที่ไม่ได้กำหนดในการเขียนโปรแกรม) การกลับมา200พร้อมกับเนื้อความว่างเปล่าหมายความว่ามีบางสิ่งอยู่ที่นั่นและบางสิ่งก็ว่างเปล่าในขณะนี้ (เช่นสตริงว่างในการเขียนโปรแกรม)

404ไม่ได้หมายความว่าเป็น "URI ที่ไม่ดี" มีรหัส HTTP พิเศษที่มีไว้สำหรับข้อผิดพลาด URI (เช่น414 Request-URI Too Long)


1
เฮ้ฉันคิดว่าคุณอาจจะทำอะไรบางอย่าง จะไม่เหมาะสมกว่าหรือถ้าจะส่งคืนหนึ่งใน "41" ข้อผิดพลาดเมื่อมีปัญหากับทรัพยากรที่ร้องขอ? ตัวอย่างเช่น410 Goneหมายถึง"ทรัพยากรที่ร้องขอไม่สามารถใช้งานได้ที่เซิร์ฟเวอร์อีกต่อไปและไม่ทราบที่อยู่การส่งต่อ" - (ดูw3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.11 )
— Brian Lacy

จริงๆแล้วทรัพยากรที่ฉันอ้างถึงข้างต้นก็บอกว่า"ถ้าเซิร์ฟเวอร์ไม่รู้หรือไม่มีเครื่องมือในการตรวจสอบว่าเงื่อนไขนั้นถาวรหรือไม่รหัสสถานะ 404 (ไม่พบ) ควรใช้แทน" ดังนั้นอาจจะไม่จำเป็นต้องเป็นตัวเลือกที่ดีที่สุดเช่นกัน ..
— Brian Lacy

2
ฉันไม่คิดว่าข้อผิดพลาด 41x จะเหมาะสมกับกรณีการใช้งานของคุณ ฉันชอบการเปรียบเทียบกับสตริงที่ไม่ได้กำหนดเทียบกับที่ว่างเปล่าซึ่งเป็นเวอร์ชันที่กระชับกว่าในคำตอบของฉัน มีความแตกต่าง แต่นั่นไม่ได้หมายความว่าสตริงว่างเปล่าเป็นข้อผิดพลาด จะยืดคล้ายคลึง: คุณอาจจะมีวิธีการที่มีการดำเนินการเช่นนี้String getName() return this.name == null ? "" : this.nameที่ไม่ถูกต้องถ้าคุณต้องการลูกค้าที่จะรู้ว่าเป็นthis.name null
— jhericks

1
404 ยังคงเป็นตัวเลือกที่เหมาะสมที่สุด คุณสามารถ (และสนับสนุนให้) ใช้เนื้อความของการตอบกลับ 404 นั้นเพื่อแจ้งผู้ใช้ / ลูกค้าของรายละเอียดเฉพาะสำหรับการรับข้อผิดพลาด ดู: stackoverflow.com/a/9999335/105484 ในกรณีของคุณคุณอาจต้องการใช้เนื้อหานั้นเพื่อแนะนำให้กับผู้ใช้ว่าพวกเขาปรับรูปแบบ URI ของพวกเขาให้ดูเหมือน / restapi / user / USER_ID
— nategood

ตกลงฉันเห็นจุดดีบางอย่างที่นี่ แต่ 4XX เป็นรหัสข้อผิดพลาดสถานการณ์นั้นเป็นข้อผิดพลาดอย่างไร ลูกค้าจะป้องกันไม่ให้ 404 เกิดขึ้นได้อย่างไร
— Krzysztof Kubicki

20

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

ก่อนอื่น URI ควรเป็นทึบ แม้ว่าพวกเขาจะไม่ทึบแสงสำหรับคน ในคำอื่น ๆ ความแตกต่างระหว่างhttp://mywebsite/api/user/13, http://mywebsite/restapi/user/13เป็นเช่นเดียวกับความแตกต่างระหว่างhttp://mywebsite/api/user/13และhttp://mywebsite/api/user/14คือไม่เหมือนกันไม่ได้ในช่วงเวลาเดียวกัน ดังนั้น 404 จะเหมาะสมอย่างสมบูรณ์สำหรับhttp://mywebsite/api/user/14(ถ้าไม่มีผู้ใช้ดังกล่าว) แต่ไม่จำเป็นต้องตอบสนองที่เหมาะสมเท่านั้น

คุณสามารถส่งคืนการตอบสนองที่ว่างเปล่า 200 ครั้งหรือตอบกลับอย่างชัดเจนมากกว่า 204 (ไม่มีเนื้อหา) สิ่งนี้จะสื่ออย่างอื่นให้กับลูกค้า มันจะบอกเป็นนัยว่าทรัพยากรที่ระบุโดยhttp://mywebsite/api/user/14ไม่มีเนื้อหาหรือไม่มีอะไรเป็นหลัก มันไม่ได้หมายความว่ามีเป็นทรัพยากรดังกล่าว อย่างไรก็ตามไม่ได้หมายความว่าคุณกำลังอ้างสิทธิ์ว่ามีผู้ใช้บางรายยืนยันอยู่ในแหล่งข้อมูลที่มี id 14 นั่นเป็นข้อกังวลส่วนตัวของคุณไม่ใช่ข้อกังวลของลูกค้าที่ส่งคำขอ ดังนั้นหากเหมาะสมที่จะสร้างแบบจำลองทรัพยากรของคุณด้วยวิธีนี้ให้ดำเนินการต่อไป

มีผลกระทบด้านความปลอดภัยบางประการในการให้ข้อมูลลูกค้าของคุณซึ่งจะช่วยให้พวกเขาเดา URI ที่ถูกกฎหมายได้ง่ายขึ้น การส่งคืน 200 เมื่อคิดถึงแทนที่จะเป็น 404 อาจทำให้ลูกค้ารู้ว่าอย่างน้อยhttp://mywebsite/api/userส่วนนั้นถูกต้อง ลูกค้าที่เป็นอันตรายสามารถลองใช้จำนวนเต็มที่แตกต่างกันได้ แต่สำหรับฉันลูกค้าที่ประสงค์ร้ายก็สามารถเดาhttp://mywebsite/api/userส่วนนั้นได้ วิธีแก้ไขที่ดีกว่าคือใช้ UUID คือจะดีกว่าhttp://mywebsite/api/user/3dd5b770-79ea-11e1-b0c4-0800200c9a66 http://mywebsite/api/user/14การทำเช่นนั้นคุณสามารถใช้เทคนิคในการคืนค่า 200 โดยไม่ให้อะไรมากมาย


1
นี่เป็นวิธีแก้ปัญหาที่ฉันเลือกและไปกับการใช้ 204 แทน 404 สำหรับฉัน 204 หมายถึง "ฉันพบรหัสของคุณ แต่ไม่พบผลลัพธ์" และ 404 หมายถึง "ฉันไม่พบรหัสที่จะเรียกใช้นี่คือ เส้นทางที่ผิด? "
— Matt Sanders

11

404 ไม่พบในทางเทคนิคหมายความว่า uri ไม่ได้แมปกับทรัพยากรในขณะนี้ ในตัวอย่างของคุณฉันตีความคำขอhttp://mywebsite/api/user/13ที่ส่งคืน404เพื่อบอกเป็นนัยว่า url นี้ไม่เคยถูกแมปกับทรัพยากร สำหรับลูกค้านั่นควรจะเป็นจุดสิ้นสุดของการสนทนา

ในการจัดการกับข้อสงสัยที่คลุมเครือคุณสามารถปรับปรุง API ของคุณโดยการให้รหัสตอบกลับอื่น ๆ ตัวอย่างเช่นสมมติว่าคุณต้องการที่จะช่วยให้ลูกค้ากับปัญหา GET ขอ URL ตัวอย่างเช่นhttp://mywebsite/api/user/13คุณต้องการที่จะสื่อสารว่าลูกค้าควรใช้ http://mywebsite/restapi/user/13URL ในกรณีดังกล่าวคุณอาจต้องการพิจารณาออกการเปลี่ยนเส้นทางแบบถาวรด้วยการส่ง301 Moved อย่างถาวรและระบุ URL ตามมาตรฐานในส่วนหัวLocationของการตอบกลับ สิ่งนี้จะบอกลูกค้าว่าสำหรับคำขอในอนาคตพวกเขาควรใช้ URL ที่เป็นที่ยอมรับ


11

ดังนั้นในสาระสำคัญดูเหมือนว่าคำตอบอาจขึ้นอยู่กับวิธีการสร้างคำขอ

หากทรัพยากรที่ร้องขอเป็นส่วนหนึ่งของ URI ตามคำขอhttp://mywebsite/restapi/user/13และผู้ใช้ 13 ไม่มีอยู่ 404 อาจเหมาะสมและใช้งานง่ายเนื่องจาก URI เป็นตัวแทนของผู้ใช้ / นิติบุคคล / เอกสาร / ฯลฯ ที่ไม่มีอยู่จริง สิ่งเดียวกันจะถือเป็นเทคนิคที่ปลอดภัยยิ่งขึ้นโดยใช้ GUID http://mywebsite/api/user/3dd5b770-79ea-11e1-b0c4-0800200c9a66และอาร์กิวเมนต์ api / restapi ด้านบน

อย่างไรก็ตามหากรหัสทรัพยากรที่ร้องขอถูกรวมไว้ในส่วนหัวคำขอ [รวมตัวอย่างของคุณเอง] หรือแน่นอนใน URI เป็นพารามิเตอร์เช่นhttp://mywebsite/restapi/user/?UID=13นั้น URI จะยังคงถูกต้อง (เพราะแนวคิดของผู้ใช้ออกจากที่http://mywebsite/restapi/user/) และดังนั้นการตอบสนองอาจคาดว่าจะเป็น 200 (พร้อมข้อความ verbose อย่างเหมาะสม) เนื่องจากผู้ใช้เฉพาะที่รู้จักในชื่อ 13 ไม่มีอยู่ แต่ URI ทำ วิธีนี้เรากำลังบอกว่า URI นั้นดี แต่คำขอข้อมูลไม่มีเนื้อหา

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

วิธีที่ดีกว่าคือการส่ง204 - No Contentคำตอบ สิ่งนี้สอดคล้องกับคำอธิบายของ w3c * เซิร์ฟเวอร์ได้ทำตามคำขอ แต่ไม่จำเป็นต้องส่งคืนเอนทิตีและอาจต้องการส่งคืนข้อมูลที่ปรับปรุงล่าสุด * 1 ความสับสนในความคิดของฉันเกิดจากรายการ Wikipedia ที่ระบุว่า204 ไม่มีเนื้อหา - เซิร์ฟเวอร์ประมวลผลคำขอเรียบร้อยแล้ว แต่ไม่ได้ส่งคืนเนื้อหาใด ๆ มักจะใช้เป็นตอบสนองต่อคำขอลบที่ประสบความสำเร็จประโยคสุดท้ายเป็นที่ถกเถียงกันอย่างมาก พิจารณาสถานการณ์ที่ไม่มีประโยคนั้นและการแก้ปัญหานั้นง่าย - เพียงแค่ส่ง 204 ถ้าไม่มีเอนทิตี แม้จะมีข้อโต้แย้งสำหรับการส่งคืน 204 แทน 404 คำขอได้รับการดำเนินการแล้วและไม่มีเนื้อหาใดถูกส่งคืน! โปรดระวังแม้ว่า 204 จะไม่อนุญาตเนื้อหาในส่วนการตอบกลับ

แหล่งที่มา

http://en.wikipedia.org/wiki/List_of_HTTP_status_codes 1. http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


9

นั่นคือโพสต์เก่ามาก แต่ฉันต้องเผชิญกับปัญหาที่คล้ายกันและฉันต้องการแบ่งปันประสบการณ์ของฉันกับพวกคุณ

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

ฉันติดตามเอกสารการออกแบบ API ส่วนที่เหลือและฉันส่ง HTTP 404 กลับพร้อมข้อความข้อผิดพลาด JSON ที่สมบูรณ์แบบให้กับลูกค้าเมื่อไม่มีข้อมูลที่สอดคล้องกับเงื่อนไขการสืบค้น (ตัวอย่างเช่นเลือกบันทึกศูนย์)

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

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

แต่ฉันต้องการเขียนโค้ดพิเศษที่สับสนเพียงเพราะ HTTP 404 มีฟังก์ชันที่แตกต่างกันสองประการ:

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

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

นี่เป็นรุ่นที่ 1 ของวิธีผู้ช่วยลูกค้าของฉันซึ่งรองรับการตอบสนอง HTTP 404 ที่ต่างกันสองรายการ:

public static String getSomething(final String uuid) {
    String serviceUrl = getServiceUrl();
    String path = "user/" + , uuid);
    String requestUrl = serviceUrl + path;
    String httpMethod = "GET";

    Response response = client
            .target(serviceUrl)
            .path(path)
            .request(ExtendedMediaType.APPLICATION_UTF8)
            .get();

    if (response.getStatus() == Response.Status.OK.getStatusCode()) {
        // HTTP 200
        return response.readEntity(String.class);
    } else {
        // confusing code comes here just because
        // I need to decide the type of HTTP 404...

        // trying to parse response body
        try {
            String responseBody = response.readEntity(String.class);
            ObjectMapper mapper = new ObjectMapper();
            ErrorInfo errorInfo = mapper.readValue(responseBody, ErrorInfo.class);

            // re-throw the original exception
            throw new MyException(errorInfo);

        } catch (IOException e) {
            // this is a real HTTP 404
            throw new ServiceUnavailableError(response, requestUrl, httpMethod);
        }

    // this exception will never be thrown
    throw new Exception("UNEXPECTED ERRORS, BETTER IF YOU DO NOT SEE IT IN THE LOG");
}

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

ถ้าฉันไม่สามารถแยกการตอบสนองนั่นหมายความว่าฉันได้รับ HTTP 404 จริงจากเว็บเซิร์ฟเวอร์ (ไม่ใช่จากแอปพลิเคชัน API ที่เหลือ)

มันสับสนมากและแอปพลิเคชันไคลเอนต์ต้องทำการวิเคราะห์คำพิเศษเพิ่มเติมเพื่อตรวจสอบเหตุผลที่แท้จริงของ HTTP 404

สุจริตฉันไม่ชอบวิธีนี้ มันสับสนต้องเพิ่มรหัสพล่ามให้กับลูกค้าตลอดเวลา

ดังนั้นแทนที่จะใช้ HTTP 404 ในสองสถานการณ์นี้ฉันจึงตัดสินใจว่าจะทำสิ่งต่อไปนี้:

  • ฉันไม่ได้ใช้ HTTP 404 เป็นรหัสการตอบสนอง HTTP ในแอปพลิเคชันที่เหลือของฉันอีกต่อไป
  • ฉันจะใช้ HTTP 204 (ไม่มีเนื้อหา) แทน HTTP 404

ในกรณีที่รหัสลูกค้าอาจสง่างามกว่า:

public static String getString(final String processId, final String key) {
    String serviceUrl = getServiceUrl();
    String path = String.format("key/%s", key);
    String requestUrl = serviceUrl + path;
    String httpMethod = "GET";

    log(requestUrl);

    Response response = client
            .target(serviceUrl)
            .path(path)
            .request(ExtendedMediaType.APPLICATION_JSON_UTF8)
            .header(CustomHttpHeader.PROCESS_ID, processId)
            .get();

    if (response.getStatus() == Response.Status.OK.getStatusCode()) {
        return response.readEntity(String.class);
    } else {
        String body = response.readEntity(String.class);
        ObjectMapper mapper = new ObjectMapper();
        ErrorInfo errorInfo = mapper.readValue(body, ErrorInfo.class);
        throw new MyException(errorInfo);
    }

    throw new AnyServerError(response, requestUrl, httpMethod);
}

ฉันคิดว่าสิ่งนี้จะจัดการกับปัญหาได้ดีกว่า

หากคุณมีทางออกที่ดีกว่านี้โปรดแบ่งปันกับเรา


วิธี Apache HttpClient จะไม่ส่งข้อยกเว้นในการตอบสนอง 204 ข้อ หากลูกค้าของคุณเพียงแค่ตอบรับออบเจ็กต์ทางธุรกิจ (โมเดล) นั่นจะส่งคืน null ใช้งานได้ แต่ยากสำหรับผู้ใช้ในการตรวจสอบสถานการณ์ 204
— chrisinmtown

เป็นเรื่องที่ดี แต่คำถามคือคุณเขียนบ่อยๆว่างบสำหรับ 404 เป็นอย่างไร แล้วมันจะเป็นอะไร? ในทางกลับกันถ้าคุณโทรไปที่ api ซึ่งกำหนด 404 ที่เป็นไปได้โดยมีข้อผิดพลาด json อยู่ภายในคุณสามารถจัดการกับกรณีนี้ได้
— สูงสุด

zappee ฉันเห็นด้วยกับคุณ ฉันมีบริการที่ส่งคืนข้อมูล แต่มีสถานการณ์ที่ข้อมูลถูกทำลาย URL คำขอนั้นถูกต้อง (ไม่ใช่ 404) แต่ไม่ใช่ข้อผิดพลาดเชิงตรรกะ (500) ดังนั้น 204 จึงดูเหมือนว่าเหมาะสมที่สุด มันน่ารำคาญจริง ๆ เกี่ยวกับการขาดเนื้อหาของข้อความ แม้ว่าเนื้อหาฉันสามารถแทรกเหตุผลลงในส่วนหัว
— cs94njw

6

บทความเก่า แต่ยอดเยี่ยมนี้ ... http://www.infoq.com/articles/webber-rest-workflowพูดเกี่ยวกับเรื่องนี้ ...

404 ไม่พบ - บริการนั้นขี้เกียจเกินไป (หรือปลอดภัย) เพื่อให้เหตุผลจริงแก่เราว่าทำไมคำขอของเราถึงล้มเหลว แต่ไม่ว่าด้วยเหตุผลอะไรก็ตามเราต้องจัดการกับมัน


1

Uniform Resource Identifier เป็นตัวชี้เฉพาะสำหรับทรัพยากร URI ที่มีรูปแบบไม่ดีไม่ได้ชี้ไปที่แหล่งข้อมูลดังนั้นการดำเนินการ GET จะไม่ส่งคืนทรัพยากร 404 หมายถึงเซิร์ฟเวอร์ไม่พบสิ่งใดที่ตรงกับ Request-URI หากคุณใส่ URI ผิดหรือ URI ไม่ถูกต้องนั่นคือปัญหาของคุณและสาเหตุที่ทำให้คุณไม่ได้รับทรัพยากรไม่ว่าจะเป็นหน้า HTML หรือ IMG


0

สำหรับสถานการณ์นี้ HTTP 404 เป็นรหัสการตอบสนองสำหรับการตอบสนองจาก REST API เช่น 400, 401, 404, 422 เอนทิตีที่ไม่สามารถประมวลผลได้

ใช้การจัดการข้อยกเว้นเพื่อตรวจสอบข้อความข้อยกเว้นแบบเต็ม

try{
  // call the rest api
} catch(RestClientException e) {
     //process exception
     if(e instanceof HttpStatusCodeException){
        String responseText=((HttpStatusCodeException)e).getResponseBodyAsString();
         //now you have the response, construct json from it, and extract the errors
         System.out.println("Exception :" +responseText);
     }

}

บล็อกข้อยกเว้นนี้ให้ข้อความที่คุณส่งโดย REST API

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