사용자 지정 HTTP 상태 코드를 만들 수 있습니까?


92

REST 및 WCF 서비스가 있고 작업에 따라 사용자 지정 상태 코드를 보내고 싶습니다.

일부 유효성 검사가 실패하면 HTTP 444를 보내고 인증이 실패하면 HTTP 455를 보내고 싶습니다.

문제는 SOAP 및 REST 웹 서비스 모두에 대해 어떻게 유효성을 검사하는지입니다.

WCF 서비스 (SOAP 사용)에서 HTTP 400/500을 보낼 때 클라이언트에서 상태 코드를 표시하는 예외가 발생하기 때문에 클라이언트에서 오류 코드가 어떻게 작동합니까?

이제 새 사용자 지정 상태 코드를 보내면 클라이언트가이를 어떻게 처리합니까?


3
이것은 당신이 세상에 노출하는 서비스입니까, 아니면 모든 클라이언트를 제어합니까?
Rup

답변:


109

예, 클래스를 존중하는 한, 즉 성공의 경우 2xx, 클라이언트 오류의 경우 4xx 등입니다. 따라서 자신의 애플리케이션 오류 조건에 대해 사용자 정의 4XX 오류 코드 (할당되지 않은 오류 코드)를 반환 할 수 있습니다.

[RFC 2616] [1]에서 인용하려면 :

"HTTP 상태 코드는 확장 가능합니다. HTTP 애플리케이션은 등록 된 모든 상태 코드의 의미를 이해할 필요는 없지만 이러한 이해가 분명히 바람직합니다. 그러나 애플리케이션은 첫 번째 숫자로 표시된 상태 코드의 클래스를 이해하고 처리해야합니다. 인식되지 않은 응답은 캐시되지 않아야한다는 점을 제외하고는 해당 클래스의 x00 상태 코드와 동일한 것으로 인식되지 않는 모든 응답입니다. 예를 들어 클라이언트가 인식 할 수없는 상태 코드 431을 수신 한 경우 요청에 문제가 있고 응답을 400 상태 코드를받은 것처럼 처리합니다. "

수업'

  • 1xx : 정보 용-요청 접수 됨, 프로세스 계속

  • 2xx : 성공-작업이 성공적으로 수신, 이해 및 수락되었습니다.

  • 3xx : 리디렉션-요청을 완료하려면 추가 조치를 취해야합니다.

  • 4xx : 클라이언트 오류-요청에 잘못된 구문이 포함되어 있거나 수행 할 수 없습니다.

  • 5xx : 서버 오류-서버가 명백하게 유효한 요청 [1]을 수행하지 못했습니다.

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


2
테스트를 제외하고는 등록되지 않은 상태 코드를 사용하지 마십시오.
Julian Reschke 2014

1
ChrisNY : HTTP를 사용할 때 등록되지 않은 상태 코드에 의존하는 경우 다른 사람이 다른 목적으로 동일한 코드를 사용하면 손상 될 수 있습니다. 더 자세한 오류 정보가 필요하면 당신은 여전히 (인스턴스에 대한 참조 페이로드에 포함 할 수 있습니다 tools.ietf.org/html/draft-nottingham-http-problem-06 )
줄리안 Reschke

21
@ChrisNY : 대부분의 웹 응용 프로그램은 단일 클라이언트 (자바 스크립트 / ajax 코드) 및 단일 서버 (사용자 서버)와 함께 작동하도록 설계되었으므로 사용자 지정 상태 코드를 사용하는 것이 좋습니다. 이러한 상황에서 '다른 사람'이 동일한 상태 코드를 사용하여 '파손'을 유발하는 것도 불가능합니다.
AR

2
그 인용문은 당신이 자신의 코드를 만들 수 있다는 것을 말하는 것이 아니라, 당신의 앱이 코드 클래스를 존중하고 4xx 등에 대한 오류를 던지는 한 등록 된 모든 코드가 무엇인지 알 필요가 없다는 것을 의미합니다. 내가 볼 수있는 유일한 문제는 앞으로 이러한 코드 중 하나가 공식적으로 할당되고 브라우저 / 자바 스크립트 기능이 변경 될 수 있다는 것입니다. 예를 들어 494 DDNS 공격은 모든 통신을 중지하고 브라우저는이를보고 js가 해당 IP로 더 이상 통신을 시작하지 못하도록 차단할 수 있습니다. 가능성은 희박하지만 당신은 100 %가 될 수 없습니다, 트위터는 귀하의 진정 강화 (420)을해도 괜찮은지 생각하는 것

1
사양은 자신의 코드를 만들 수 있으며 코드 471을 예로 사용합니다. 그것은 400로 동등 인식 할 수없는 4XX 오류 가정 말한다
제프 로워

32

예제에서 수행하려는 작업에 적용 가능한 코드가 이미 존재 하는 경우 자체 HTTP 상태 코드를 작성하지 않는 것이 좋습니다 .

  • 처리 할 수없는 오류 : 상태 422
  • 인증 실패 : 상태 403

에서 https://tools.ietf.org/html/rfc4918#section-11.2 :

422 [Unprocessable Entity] 상태 코드는 서버가 요청 엔티티의 컨텐츠 유형을 이해하고 (따라서 415 [Unsupported Media Type] 상태 코드가 부적절 함) 요청 엔티티의 구문이 정확함 (따라서 400 [Bad Request ] 상태 코드가 부적절 함) 포함 된 지침을 처리 할 수 ​​없습니다. 예를 들어,이 오류 조건은 XML 요청 본문에 올바른 형식 (즉, 구문 적으로 올바른)이 포함되어 있지만 의미 상 잘못된 XML 명령이 포함 된 경우 발생할 수 있습니다.

"처리 할 수 ​​없음"은 유효성 검사 오류 때문일 수 있습니다.


10
인증 실패는 403이 아니라 401입니다. 403은 금지되어 있으며 인증으로 문제가 해결되지 않습니다.
Neil Hickman 2014 년

6
401은 이름에도 불구하고 실패한 인증 에 관한 것 입니다.
Julian Reschke 2014 년

1
(401)는 "제발 로그인 (다시)"입니다
CodesInChaos

19

예, 사용자 지정 오류 코드를 추가 할 수 있습니다. 가능하다면 이미 존재하는 코드를 사용하고 새로운 코드를 선언하는 경우 충돌을 피하도록주의하십시오.

일부 프록시는 알 수없는 코드를 필터링한다는 점을 알고 있어야합니다 . 5XX를 500으로, 4XX를 404로 매핑 한 프록시 뒤에있는 사용자와 문제가있었습니다. 이로 인해 상태 코드 확인이 실패하는 곳을 ajax 호출이 발생했습니다.


예, 프록시는 엉망입니다. 프록시 구현 이름을 모르지만 자체적으로 사용자 지정 상태 코드를 해석하고 클라이언트에 응답을 보내지 않았습니다.
asgs 2014

16

일부 응용 프로그램은 600-799 범위의 사용자 지정 응답 코드를 추가합니다. 여기에서 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가 불법 상태 코드를 사용하기 때문에 내 대답에 반대 투표는 정당하지 않은 것 같습니다. 나는 토론을 먹이고 있습니다.
Wilt


-12

아니요, rfc 문서 요구 사항 코드 만 사용할 수 있습니다. 자세한 내용은 RFC1945를 참조하십시오.


4
iana.org/assignments/http-status-codes에 정의 된 모든 상태 코드를 사용할 수 있습니다 .
Julian Reschke 2011

@Julian, 이것은 Rajesh가 그의 목적을 위해 "427-499 Unassigned"를 사용할 수 있다는 것을 의미합니까?
IrishChieftain 2011

확인 후 :-) 해당 목록에서 할당 된 상태 코드를 사용할 수 있습니다 . 또는 새 상태 코드에 대한 사양을 작성하고 등록합니다.
Julian Reschke 2011

5
기술적으로는 원하는대로 사용할 수 있습니다. 다른 사람과 잘 어울릴 것이라고 기대하지 마십시오. OP에서 질문했듯이-Rajesh가 모든 클라이언트를 제어하면 "1337-모든 기지는 우리에게 속합니다"를 이해하게 만들 수 있습니다. )
고넬료

1
90 년대 초부터 사용되지 않은 HTTP / 1.0 상태 코드에 연결했습니다.
andsens
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.