我有一个端点,该端点需要通过查询字符串(是GET动词)传递一个参数。
当请求中缺少此参数时,应该提供什么适当的状态代码? 400是一个?还是应该以404回复?
[GET /search?q=ok] => 200 OK
[GET /search] => 400 Bad Request? or 404 Not Found? Or 422 Unprocessable Entity? Others?
答案 0 :(得分:2)
TLDR 。这是一个HTTP 400-错误请求。
这是400
,因为用户没有发送 Required 输入字段。
为什么不是422 -因为这种情况适合400
。牢记您的消费者,如果您确实不需要,则不应使用非受欢迎的响应代码。
HTTP 404的情况:
1)您的服务器中不存在客户端请求的网址(通常由您的服务器处理。除非您想要一个漂亮的404页面,否则应用程序开发人员通常无需执行任何操作)。
2)如果它是一个path
参数,并且客户端正在寻找具有ID的实体(例如(/students/{id}
,而您的应用程序找不到该实体,则可以使用HTTP进行响应) 404。
比方说,用户发送了查询参数,但您没有找到与查询参数匹配的任何项目,没有错,它仍然是一个HTTP 200
,其主体为空数组左右(不是404中提到的404)以前的情况)
答案 1 :(得分:1)
应该为400-错误的请求。
由于格式错误,服务器无法理解该请求 句法。客户端不应在没有以下情况的情况下重复请求 修改。
404-找不到
“找不到HTTP 404错误”表示您尝试访问的网页 在服务器上找不到范围。这是客户端错误 这意味着页面已被删除或移动,URL 没有相应地更改,或者您输入的URL错误。
这意味着服务器无法找到您指定的URI。但是在您的情况下URI有效,但缺少参数,因此使用400是正确的方法。
答案 2 :(得分:0)
当请求中缺少此参数时,应该提供什么适当的状态代码? 400是一个?还是应该以404回复?
我认为404是合适的
404(未找到)状态代码表示原始服务器已执行 找不到目标资源的当前表示或找不到 愿意透露存在。
您的路由实现碰巧将/search
和/search?q=ok
发送到同一处理程序这一事实并不意味着它们是相同的资源。 /search
标识资源,没有可用的当前表示形式,因此您将响应发送回给消费者以解释问题,然后将404放入元数据中。
规范中最大的提示是:
默认情况下404响应是可缓存的
这使我们可以通知客户端(和任何中间组件)此响应可以重复使用。
这是一个有用的属性,不适用于400 Bad Request
启发式:您的网络api应该像文档存储一样。如果您要求文件存储为您提供文件,但是您将密钥拼写错误,您会得到什么? KeyNotFound
异常的某种形式。如果您向Web服务器请求主目录中的文档,但会拼写错误的文件名,也会得到相同的结果。
响应的语义指示要使用的正确状态代码,而不是实现详细信息。