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.