我们可以创建自定义HTTP状态代码吗?


92

我有REST和WCF服务,并希望根据操作发送自定义状态代码。

例如,当某些验证失败时,我想发送HTTP 444;当授权失败时,我想发送HTTP 455

问题是我们如何对SOAP和REST Web服务进行验证。

在客户端上,错误代码如何起作用,因为当您从WCF服务发送HTTP 400/500(使用SOAP)时,客户端上会抛出一个异常,显示状态代码。

现在,如果我发送新的自定义状态代码,客户端将如何处理?


3
这是您要向世人展示的服务,还是您也控制着所有客户?
Rup

Answers:


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
除测试外,请勿使用未注册的状态码。
朱利安·雷施克

1
克里斯尼:好吧,如果您在使用HTTP时依赖未注册的状态代码,那么如果其他人出于不同的目的使用相同的代码,则可能会造成破坏。如果您需要更详细的错误信息,您仍然可以将其嵌入有效负载中(例如,参见tools.ietf.org/html/draft-nottingham-http-problem-06)–
朱利安·

21
@ChrisNY:大多数Web应用程序都设计为可与单个客户端(您的javascript / ajax代码)和单个服务器(您的服务器)一起使用,因此使用自定义状态代码是完全可以的。在这些情况下,“其他人”甚至不可能使用相同的状态代码来导致“损坏”。
2014年

2
那句话不是说您可以编写自己的代码,而是说您的应用程序不需要知道每个注册的代码是什么,只要它尊重代码类并为4xx等引发错误即可。此外,我唯一能看到的问题是,将来这些代码之一将被正式分配,并且浏览器/ javascript功能可能会更改。例如494 DDNS攻击停止了所有通信,浏览器可能会看到并阻止js启动对该IP的更多通信。Twitter似乎不太可能,但您不可能100%做到这一点,Twitter似乎认为可以做420增强您的平静
Matt

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
授权失败是401,而不是403。禁止403,因为授权无法解决问题。
尼尔·希克曼

6
401关于失败的身份验证(尽管有名称)。
朱利安·雷施克

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之外的任何值。
朱利安·雷施克

16
@JulianReschke我什至提到我“不敢说这是否是一种好习惯”。我仅添加对其他应用程序功能的引用。不赞成我的回答,因为Keynote使用非法的状态代码似乎是没有道理的。我只提供讨论。
Wilt


-12

否,您只能使用RFC文档要求代码,请参阅RFC1945中的详细信息


4
您可以使用iana.org/assignments/http-status-codes中定义的任何状态码。
朱利安·雷施克

@Julian,这是否意味着Rajesh可以将“ 427-499 Unassigned”用于他的目的?
IrishChieftain

单击确定,然后:-)可以使用该列表中分配的任何状态代码。或者您编写新状态代码的规范并进行注册。
朱利安·雷施克

5
从技术上讲,您可以使用自己喜欢的任何东西。只是不要期望它能与其他任何人一起玩。正如OP中的要求-如果Rajesh控制所有客户,他可以使他们理解“ 1337-您的所有基地都属于我们”,因此他们很高兴。;)
Cornelius 2012年

1
您已链接到HTTP / 1.0状态代码,该代码自90年代初以来就没有使用过。
andsens 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.