Chúng tôi có thể tạo mã Trạng thái HTTP tùy chỉnh không?


92

Tôi có dịch vụ REST và WCF và muốn gửi mã trạng thái tùy chỉnh dựa trên hoạt động.

Ví dụ khi một số xác thực không thành công thì tôi muốn gửi HTTP 444 và khi ủy quyền không thành công, tôi muốn gửi HTTP 455

Câu hỏi đặt ra là làm cách nào để chúng tôi xác thực nó cho cả dịch vụ web SOAP và REST.

Trên máy khách, mã lỗi hoạt động như thế nào vì khi bạn gửi HTTP 400/500 từ Dịch vụ WCF (sử dụng SOAP), một ngoại lệ sẽ được đặt trên máy khách hiển thị mã trạng thái.

Bây giờ nếu tôi gửi một mã trạng thái tùy chỉnh mới thì khách hàng sẽ xử lý như thế nào?


3
Đây có phải là một dịch vụ mà bạn đang giới thiệu với thế giới hay bạn cũng kiểm soát tất cả các khách hàng?
Rup

Câu trả lời:


109

Có, miễn là bạn tôn trọng lớp - nghĩa là 2xx cho thành công, 4xx cho lỗi Máy khách, v.v. Vì vậy, bạn có thể trả về mã lỗi 4XX tùy chỉnh (tốt nhất là những mã chưa được gán) cho các điều kiện lỗi của ứng dụng của riêng bạn.

Để trích dẫn từ [RFC 2616] [1]:

"Mã trạng thái HTTP có thể mở rộng được. Các ứng dụng HTTP không bắt buộc phải hiểu ý nghĩa của tất cả các mã trạng thái đã đăng ký, mặc dù việc hiểu như vậy rõ ràng là mong muốn. Tuy nhiên, các ứng dụng PHẢI hiểu lớp của bất kỳ mã trạng thái nào, như được chỉ ra bởi chữ số đầu tiên và xử lý bất kỳ phản hồi không được công nhận nào là tương đương với mã trạng thái x00 của lớp đó, ngoại trừ phản hồi không được công nhận KHÔNG PHẢI được lưu vào bộ nhớ đệm. Ví dụ: nếu máy khách nhận được mã trạng thái không nhận dạng là 431, nó có thể an toàn giả định rằng có có gì đó sai với yêu cầu của nó và xử lý phản hồi như thể nó đã nhận được mã trạng thái 400. "

Lớp học'

  • 1xx: Thông tin - Đã nhận được yêu cầu, đang tiếp tục quá trình

  • 2xx: Thành công - Hành động đã được nhận, hiểu và chấp nhận thành công

  • 3xx: Chuyển hướng - Phải thực hiện thêm hành động để hoàn thành yêu cầu

  • 4xx: Lỗi máy khách - Yêu cầu chứa cú pháp sai hoặc không thể thực hiện được

  • 5xx: Lỗi Máy chủ - Máy chủ không thực hiện được yêu cầu hợp lệ [1]:

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


2
Không sử dụng mã trạng thái chưa đăng ký, ngoại trừ để thử nghiệm.
Julian Reschke

1
ChrisNY: tốt, nếu bạn dựa vào các mã trạng thái chưa đăng ký khi sử dụng HTTP, thì có thể xảy ra lỗi nếu ai đó sử dụng cùng một mã cho một mục đích khác. Nếu bạn cần thông tin lỗi chi tiết hơn bạn vẫn có thể nhúng nó trong payload (xem ví dụ tools.ietf.org/html/draft-nottingham-http-problem-06 )
Julian Reschke

21
@ChrisNY: Hầu hết các ứng dụng web được thiết kế để hoạt động với một ứng dụng khách (mã javascript / ajax của bạn) và một máy chủ duy nhất (máy chủ của bạn) nên việc sử dụng mã trạng thái tùy chỉnh là hoàn toàn ổn. Trong những tình huống này, 'ai đó khác' thậm chí không thể gây ra 'sự cố' bằng cách sử dụng cùng một mã trạng thái.
AR

2
Trích dẫn đó không nói rằng bạn có thể tạo mã của riêng mình, mà nó nói rằng ứng dụng của bạn không cần biết mọi mã đã đăng ký là gì miễn là nó tôn trọng lớp mã và gây ra lỗi cho 4xx, v.v. vấn đề duy nhất tôi có thể thấy là trong tương lai, một trong những mã này được chỉ định chính thức và chức năng của trình duyệt / javascript có thể thay đổi. Ví dụ: 494 Tấn công DDNS dừng tất cả giao tiếp, trình duyệt có thể thấy điều đó và chặn js bắt đầu bất kỳ liên kết nào tới ip đó. Rất khó xảy ra nhưng bạn không thể là 100%, Twitter dường như nghĩ rằng bạn có thể làm 420 Nâng cao sự bình tĩnh của bạn
Matt

1
Thông số kỹ thuật nói rằng bạn có thể tạo mã của riêng mình và sử dụng mã 471 làm ví dụ. Nó nói với giả định bất kỳ lỗi 4xx không được công nhận là tương đương với 400.
Jeff Lowery

32

Tôi khuyên bạn không nên tạo mã trạng thái HTTP của riêng mình, khi các mã áp dụng đã tồn tại cho những việc bạn muốn làm trong ví dụ của mình.

Từ https://tools.ietf.org/html/rfc4918#section-11.2 :

Mã trạng thái 422 [Đối tượng không thể xử lý] có nghĩa là máy chủ hiểu loại nội dung của thực thể yêu cầu (do đó mã trạng thái 415 [Loại phương tiện không được hỗ trợ] không phù hợp) và cú pháp của thực thể yêu cầu là đúng (do đó, 400 [Yêu cầu không hợp lệ ] mã trạng thái không phù hợp) nhưng không thể xử lý các hướng dẫn có sẵn. Ví dụ, điều kiện lỗi này có thể xảy ra nếu một phần thân yêu cầu XML chứa các hướng dẫn XML được định dạng tốt (nghĩa là chính xác về mặt cú pháp), nhưng sai về mặt ngữ nghĩa, các hướng dẫn XML.

Có thể lập luận rằng "không thể xử lý" có thể là do lỗi xác thực.


10
Cấp phép không thành công là 401, không phải 403. 403 bị cấm, nơi ủy quyền sẽ không khắc phục được sự cố.
Neil Hickman

6
401 là về xác thực không thành công (mặc dù tên).
Julian Reschke

1
401 là "Vui lòng đăng nhập (lại)"
CodesInChaos

19

Có, bạn có thể thêm mã lỗi tùy chỉnh. Nếu có thể, hãy sử dụng các mã đã tồn tại và nếu bạn đang khai báo các mã mới, hãy cẩn thận để tránh va chạm.

Mặc dù vậy, bạn nên lưu ý rằng một số proxy lọc các mã không xác định . Tôi đã gặp sự cố với người dùng mà đằng sau proxy đã ánh xạ 5XX đến 500 và 4XX thành 404. Điều này khiến cuộc gọi ajax của tôi không thành công khi kiểm tra mã trạng thái.


vâng, proxy rất tệ. Tôi không biết tên triển khai proxy, nhưng nó tự diễn giải mã trạng thái tùy chỉnh của chúng tôi và không gửi phản hồi cho máy khách.
asgs

16

Một số ứng dụng thêm mã phản hồi tùy chỉnh của họ trong phạm vi 600-799. Kiểm tra ví dụ danh sách mã phản hồi từ KeyNote tại đây

Mã lỗi do Keynote xác định (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).

Tôi không dám nói đây là thực hành tốt, nhưng ít nhất nó cũng là một tài liệu tham khảo thú vị.


1
Những giá trị đó là bất hợp pháp, trong đó thông số kỹ thuật HTTP không cho phép bất kỳ thứ gì bên ngoài 100 ... 599.
Julian Reschke

16
@JulianReschke Tôi thậm chí còn đề cập rằng tôi "không dám nói liệu đó có phải là thực hành tốt hay không". Tôi chỉ thêm một tham chiếu đến những gì các ứng dụng khác làm. Bỏ phiếu cho câu trả lời của tôi vì Keynote sử dụng mã trạng thái bất hợp pháp có vẻ không hợp lý. Tôi chỉ đang cho thảo luận.
Héo


-12

Không, bạn chỉ có thể sử dụng mã yêu cầu tài liệu rfc , xem chi tiết trong RFC1945


4
Bạn có thể sử dụng bất kỳ mã trạng thái nào được xác định trong iana.org/assignments/http-status-codes .
Julian Reschke

@Julian, điều này có nghĩa là Rajesh có thể sử dụng những cái "427-499 Chưa được gán" cho mục đích của mình?
AilenChieftain

OK sau đó :-) Bạn có thể sử dụng bất kỳ mã trạng thái nào được chỉ định từ danh sách đó. Hoặc bạn viết một thông số kỹ thuật cho một mã trạng thái mới và đăng ký nó.
Julian Reschke

5
Về mặt kỹ thuật, bạn có thể sử dụng bất cứ thứ gì bạn muốn. Chỉ cần không mong đợi nó sẽ chơi tốt với bất kỳ ai khác. Như đã hỏi trong OP - nếu Rajesh kiểm soát tất cả các khách hàng, anh ấy có thể làm cho họ hiểu "1337 - Tất cả cơ sở của bạn đều thuộc về chúng tôi" họ rất hài lòng. ;)
Cornelius

1
Bạn đã liên kết với mã trạng thái HTTP / 1.0, mã này đã không được sử dụng từ đầu những năm 90.
andsens
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.