Ian*_*oyd 7 lookup web-services http
我正在构建一个网络服务,在这种特殊情况下,用于询问有关顾客的信息.
让我们说,为了争论,查找网络命中是:
GET /patrons/619 HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
如果找到了顾客,我会返回代码200:
HTTP/1.1 200 OK
Run Code Online (Sandbox Code Playgroud)
如果您省略或给出不是数字的帐号,我将返回400.例如以下错误请求:
GET /patrons HTTP/1.1
GET /patrons/ HTTP/1.1
GET /patrons/G619 HTTP/1.1
GET /patrons/kirsten%20guyer HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
所有返回错误400(错误请求),例如:
HTTP/1.1 400 Invalid patron number
Run Code Online (Sandbox Code Playgroud)
我希望找到未找到顾客的状态代码,作为HTTP状态代码返回.例如:
GET /patrons/1322 HTTP/1.1
HTTP/1.1 404 Not Found
Run Code Online (Sandbox Code Playgroud)
我已经考虑过使用404(Not Found),这是一个有效的响应(请求的资源是,真的,真的,没有找到.)但我担心人们调试它可能会认为这意味着他们拼错/patrons/了.
谁能想到我可以使用的另一个http状态代码?
更新:我很有眼力
204 No Content
The server successfully processed the request, but is not returning any content.
Run Code Online (Sandbox Code Playgroud)
怎么说你?
不要忘记,并非所有HTTP服务器都提供HTML内容.如果要求IIS Web服务器提供名为的资源:
GET /MyStartPage.html HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
然后HTTP服务器必须决定响应什么.在大多数Web服务器上,名为/MyStartPage.html的资源对应于位于硬盘驱动器上的文件.
而StackOverflow则:
GET /posts/1027301 HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
其中,如果该资源不存在,则Web服务器应该(正确地)返回404.
cgp*_*cgp 17
404 Not Found是正确的回归,如果它是一项服务,它并不是真正被人类使用而是被机器使用,因此,错别字,不应该是你的第一个问题.
而且,你无论如何都无法对抗人类的行为(想到一件事,当它真的是另一件事).如果你作为错误代码的一部分返回一个小错误消息,一切都应该解决.你甚至可以向他们建议一个可能的解决方案.
当应用程序正在完成它的设计时,返回500也似乎有点奇怪.404准确描述了这种情况:未找到资源.
对于这种情况,错误404实际上是更可接受的响应,因为找不到资源.您可以随时拥有一个自定义错误文档,说明它是未找到的Patron ID.
400错误意味着客户端发送了格式错误的语法,在您的示例中并非如此.因此,您不应该使用此错误代码.可能看起来"错误请求"是准确的,但这实际上意味着请求头语法中存在错误.
这也不是500错误,因为没有发生错误.满足请求的Web服务器没有问题,事实是请求正在寻找不存在的资源.
404是唯一合适的响应,除非您想将其视为完全有效的请求,返回状态200以及解释所请求的Patron不存在的页面.
从我对该问题的原始评论:
我认为200级错误也不合适,请考虑W3上的解释w3.org/Protocols/rfc2616/rfc2616-sec10.html
恕我直言,HTTP响应不适合处理这个问题,因为错误不在HTTP级别.它在应用程序级别.一种可能的解决方案是使用Null对象模式返回符合Patron界面的null"Patron",但表示不存在此类人员.
更新:我一直坚信这个答案是错误的.但是,我想把它留下来,因为它是一个潜在有效的答案(取决于问题中未提供的细节),我认为这些评论是有益的.