查询字符串中缺少参数时使用什么状态代码?

时间:2018-08-22 15:47:18

标签: rest http rfc

我有一个端点,该端点需要通过查询字符串(是GET动词)传递一个参数。

当请求中缺少此参数时,应该提供什么适当的状态代码? 400是一个?还是应该以404回复?

[GET /search?q=ok] => 200 OK
[GET /search] => 400 Bad Request? or 404 Not Found? Or 422 Unprocessable Entity? Others?

3 个答案:

答案 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服务器请求主目录中的文档,但会拼写错误的文件名,也会得到相同的结果。

响应的语义指示要使用的正确状态代码,而不是实现详细信息。