เราสามารถสร้างรหัสสถานะ HTTP ที่กำหนดเองได้หรือไม่?


92

ฉันมีบริการ REST และ WCF และต้องการส่งรหัสสถานะที่กำหนดเองตามการดำเนินการ

ตัวอย่างเมื่อการตรวจสอบความถูกต้องล้มเหลวฉันต้องการส่ง HTTP 444 และเมื่อการอนุญาตล้มเหลวฉันต้องการส่ง HTTP 455

คำถามคือเราจะตรวจสอบความถูกต้องสำหรับทั้ง SOAP และ REST web services ได้อย่างไร

ในไคลเอนต์รหัสข้อผิดพลาดทำงานอย่างไรเนื่องจากเมื่อคุณส่ง HTTP 400/500 จากบริการ WCF (โดยใช้ SOAP) จะมีข้อยกเว้นเกิดขึ้นกับไคลเอ็นต์ที่แสดงรหัสสถานะ

ตอนนี้ถ้าฉันส่งรหัสสถานะที่กำหนดเองใหม่ไคลเอนต์จะจัดการกับสิ่งนี้อย่างไร


3
นี่คือบริการที่คุณกำลังเปิดเผยต่อโลกหรือคุณควบคุมลูกค้าทั้งหมดด้วย?
Rup

คำตอบ:


109

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

อ้างจาก [RFC 2616] [1]:

"รหัสสถานะ HTTP สามารถขยายได้แอปพลิเคชัน HTTP ไม่จำเป็นต้องเข้าใจความหมายของรหัสสถานะที่ลงทะเบียนทั้งหมดแม้ว่าความเข้าใจดังกล่าวจะเป็นที่ต้องการอย่างชัดเจนอย่างไรก็ตามแอปพลิเคชันต้องเข้าใจคลาสของรหัสสถานะใด ๆ ตามที่ระบุโดยตัวเลขหลักแรกและปฏิบัติ การตอบสนองใด ๆ ที่ไม่รู้จักว่าเทียบเท่ากับรหัสสถานะ x00 ของคลาสนั้นยกเว้นว่าต้องไม่แคชการตอบกลับที่ไม่รู้จักตัวอย่างเช่นหากไคลเอ็นต์ได้รับรหัสสถานะที่ไม่รู้จัก 431 ก็สามารถสันนิษฐานได้อย่างปลอดภัยว่ามี มีบางอย่างผิดปกติกับคำขอและปฏิบัติต่อคำตอบราวกับว่าได้รับรหัสสถานะ 400 "

คลาส '

  • 1xx: ให้ข้อมูล - ได้รับคำขอแล้วกำลังดำเนินการต่อ

  • 2xx: ความสำเร็จ - การดำเนินการได้รับเข้าใจและยอมรับเรียบร้อยแล้ว

  • 3xx: การเปลี่ยนเส้นทาง - ต้องดำเนินการเพิ่มเติมเพื่อดำเนินการตามคำขอ

  • 4xx: Client Error - คำร้องขอมีไวยากรณ์ที่ไม่ถูกต้องหรือไม่สามารถดำเนินการได้

  • 5xx: ข้อผิดพลาดของเซิร์ฟเวอร์ - เซิร์ฟเวอร์ล้มเหลวในการดำเนินการตามคำขอที่ถูกต้องชัดเจน [1]:

http://tools.ietf.org/html/rfc2616#section-6.1.1


2
อย่าใช้รหัสสถานะที่ไม่ได้ลงทะเบียนยกเว้นการทดสอบ
Julian Reschke

1
ChrisNY: ถ้าคุณใช้รหัสสถานะที่ไม่ได้ลงทะเบียนในการใช้ HTTP อาจเกิดความเสียหายได้หากมีผู้อื่นใช้รหัสเดียวกันเพื่อวัตถุประสงค์อื่น หากคุณต้องการข้อมูลข้อผิดพลาดโดยละเอียดคุณยังสามารถฝังไว้ใน payload ได้ (ดูตัวอย่างเช่นtools.ietf.org/html/draft-nottingham-http-problem-06 )
Julian Reschke

21
@ChrisNY: เว็บแอปพลิเคชันส่วนใหญ่ได้รับการออกแบบมาเพื่อทำงานกับไคลเอนต์เดียว (รหัส javascript / ajax ของคุณ) และเซิร์ฟเวอร์เดียว (เซิร์ฟเวอร์ของคุณ) ดังนั้นการใช้รหัสสถานะที่กำหนดเองจึงทำได้ดี ในสถานการณ์เหล่านี้เป็นไปไม่ได้เลยที่ "คนอื่น" จะทำให้เกิด "ความแตกแยก" โดยใช้รหัสสถานะเดียวกัน
AR

2
คำพูดนั้นไม่ได้บอกว่าคุณสามารถสร้างรหัสของคุณเองได้โดยบอกว่าแอปของคุณไม่จำเป็นต้องรู้ว่ารหัสที่ลงทะเบียนทั้งหมดนั้นเป็นอย่างไรตราบใดที่ยังเคารพคลาสรหัสและส่งข้อผิดพลาดสำหรับ 4xx เป็นต้นนอกจากนั้น ปัญหาเดียวที่ฉันเห็นคือในอนาคตรหัสเหล่านี้จะได้รับมอบหมายอย่างเป็นทางการและฟังก์ชันการทำงานของเบราว์เซอร์ / จาวาสคริปต์อาจเปลี่ยนแปลง เช่น 494 DDNS attack หยุดการสื่อสารทั้งหมดเบราว์เซอร์อาจเห็นสิ่งนั้นและบล็อก js ไม่ให้เริ่ม comms ไปยัง ip นั้นอีก ไม่น่าเป็นไปได้สูง แต่คุณไม่สามารถเป็น 100% ได้ดูเหมือนว่า Twitter จะคิดว่าเป็นเรื่องปกติที่จะทำ 420 Enhance Your Calm
Matt

1
ข้อมูลจำเพาะระบุว่าคุณสามารถสร้างรหัสของคุณเองได้และใช้รหัส 471 เป็นตัวอย่าง มันบอกว่าให้ถือว่าข้อผิดพลาด 4xx ที่ไม่รู้จักเท่ากับ 400
Jeff Lowery

32

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

จากhttps://tools.ietf.org/html/rfc4918#section-11.2 :

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

เป็นที่ถกเถียงกันอยู่ว่า "ไม่สามารถดำเนินการได้" อาจเกิดจากข้อผิดพลาดในการตรวจสอบ


10
การอนุญาตล้มเหลวคือ 401 ไม่ใช่ 403 ห้ามใช้ 403 ซึ่งการอนุญาตจะไม่สามารถแก้ไขปัญหาได้
Neil Hickman

6
401 เป็นเรื่องเกี่ยวกับการพิสูจน์ตัวตนที่ล้มเหลว(แม้จะมีชื่อก็ตาม)
Julian Reschke

1
401 คือ "กรุณาเข้าสู่ระบบ (อีกครั้ง)"
CodesInChaos

19

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

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


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

16

บางแอปพลิเคชันเพิ่มรหัสตอบกลับที่กำหนดเองในช่วง 600-799 ตรวจสอบตัวอย่างรายการรหัสตอบกลับจาก KeyNote ที่นี่

รหัสข้อผิดพลาดที่กำหนดโดย Keynote (600-799)

600: CONNECTION ERROR - This indicates a general connection error
601: INCOMPLETE ERROR - This indicates sever sends an incomplete page/object (as indicated by Content-Length header)
602: UNEXPECTED CLOSE ERROR - This indicates socket connection has been closed unexpectedly
603: REFUSED ERROR - This indicates a request to connect to the server is refused
604: TIMEOUT ERROR - This indicates there is no activity in socket connection in 3 minutes
605: REDIRECT ERROR - This indicates an error in redirect HTTP header
606: SSL ERROR - This indicates a general error in SSL
607: HEADER ERROR - This indicates a malformed HTTP header
608: EMPTY RESPONSE ERROR - This indicates server doesn't send any response after a request is sent
609: UNKNOWN HOST ERROR - This indicates socket receives an unknown host error from DNS
610: NO ROUTE TO HOST ERROR - This indicates a no route to host error was received while attempting to open a socket
611: SOCKET ERROR - This indicates a general socket error
612: FRAME LOOP ERROR - This indicates a page has a frame loop (frame A includes Frame B that includes Frame A)
613: REDIRECT LOOP ERROR - This indicates a page has a redirect loop (page A redirects to page B that redirects to page A)
614: CONNECTION RESET ERROR - This indicates socket receive a reset signal from the server
615: SOCKET PROTOCOL ERROR - This indicates an error in socket protocol
616: SOCKET BIND ERROR - This indicates an error in binding the socket
617: CONNECTION ERROR - This indicates a general socket connection error
618: CHUNK ERROR - This indicates an error in chunked encoding
619: SSL TIMEOUT - This indicates a timeout during SSL handshake (2 minutes)
620: SSL END OF INPUT - This indicates an end-of-file is received during SSL handshake
621: SSL HANDSHAKE ERROR - This indicates a general error during SSL handshake
622: SSL CERTIFICATE ERROR - This indicates an error in SSL certificate verification
623: SSL AUTHENTICATION ERROR - This indicates an authentication error during SSL handshake
624: SSL BAD MAC ERROR - This indicates a bad MAC during SSL handshake
625: SSL CIPHER ERROR - This indicates a cipher error during SSL handshake
701: ERROR TEXT FOUND - This code is returned if any error text (such as, "Service Unavailable") are found in the main page (frame HTML contents included). Note that the error text must be defined in advance of the test. Error text means if the text is found, this session should be considered a failure.
702: REQUIRED TEXT NOT FOUND - This code is returned If not all required texts are found in the main page. Note that required text must be defined in advance of the test. Required text means if the text is not found, this session should be considered a failure.
703: HTML BODY EMPTY - This code is returned if the HTML body of the page is empty (only if error text or required text has been defined).

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


1
ค่าเหล่านี้ผิดกฎหมายเนื่องจากข้อมูลจำเพาะ HTTP ไม่อนุญาตให้มีสิ่งใดนอก 100 ... 599
Julian Reschke

16
@JulianReschke ฉันถึงกับพูดว่า ฉันเพิ่มการอ้างอิงถึงสิ่งที่แอปพลิเคชันอื่นทำ ลงคะแนนคำตอบของฉันเนื่องจาก Keynote ใช้รหัสสถานะที่ผิดกฎหมายดูเหมือนจะไม่ยุติธรรม ฉันกำลังให้อาหารการอภิปรายเท่านั้น
เหี่ยว

5

นี่คือรายการเต็มรูปแบบของที่มีอยู่ / พร้อมใช้งานทุกHTTPรหัส

https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml

ตัวอย่างเช่นลูกศรต่อไปนี้สามารถใช้ได้ (เนื่องจากไม่ได้กำหนด) กับ4XXครอบครัว

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

ฉันหวังว่านี่จะช่วยใครบางคนได้

ขอบคุณ


-12

ไม่ได้คุณสามารถใช้ได้เฉพาะรหัสข้อกำหนดเอกสาร rfc ดูรายละเอียดในRFC1945


4
คุณสามารถใช้รหัสสถานะใด ๆ ที่กำหนดไว้ในiana.org/assignments/http-status-codes
Julian Reschke

@Julian นี่หมายความว่า Rajesh สามารถใช้ "427-499 Unassigned" สำหรับวัตถุประสงค์ของเขาได้หรือไม่?
IrishChieftain

ตกลงแล้ว :-) คุณสามารถใช้รหัสสถานะที่กำหนดจากรายการนั้น หรือคุณเขียนข้อกำหนดสำหรับรหัสสถานะใหม่และลงทะเบียน
Julian Reschke

5
ในทางเทคนิคคุณสามารถใช้อะไรก็ได้ที่คุณต้องการ อย่าคาดหวังว่ามันจะเล่นได้ดีกับคนอื่น ตามที่ถามใน OP - ถ้า Rajesh ควบคุมลูกค้าทั้งหมดเขาสามารถทำให้พวกเขาเข้าใจ "1337 - ฐานทั้งหมดของคุณเป็นของเรา" พวกเขาก็พอใจ ;)
Cornelius

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