当查询字符串中缺少参数时使用什么状态代码?
What status code to use when a parameter is missing in the query string?
我有一个端点需要通过查询字符串(是 GET 动词)传递参数。
当请求中缺少此参数时,应提供什么适当的状态代码? 400是那个?还是我应该用 404 响应?
[GET /search?q=ok] => 200 OK
[GET /search] => 400 Bad Request? or 404 Not Found? Or 422 Unprocessable Entity? Others?
应该是 400 - 错误请求。
The request could not be understood by the server due to malformed
syntax. The client SHOULD NOT repeat the request without
modifications.
404 - 未找到
The HTTP 404 Not Found Error means that the webpage you were trying to
reach could not be found on the server. It is a Client-side Error
which means that either the page has been removed or moved and the URL
was not changed accordingly, or that you typed in the URL incorrectly.
这意味着服务器无法找到您指定的 URI。但在您的情况下,URI 有效但缺少参数,因此 400 是正确的方法。
TLDR 这是 HTTP 400 - 错误请求。
这是一个 400
,因为用户没有发送 必填 输入字段。
为什么不是 422 - 因为这种情况适合 400
。请牢记您的消费者,如果您确实不需要,则不应使用不受欢迎的响应代码。
HTTP 404 案例:
1) Url 客户端请求的内容在您的服务器中不存在(通常这将由您的服务器处理。应用程序开发人员通常不需要做任何事情,除非您想要一个漂亮的 404 页面和 SEO 原因)。
2) 如果它是一个 path
参数并且客户端正在寻找具有 id 的实体(例如 (/students/{id}
并且您的应用程序找不到这样的实体,您可以响应一个 HTTP 404。
比方说,用户发送了查询参数,但您没有找到任何与查询参数匹配的项目,别搞错了,它仍然是一个 HTTP 200
,正文是一个空数组左右(不是 404,不像上例中提到)
What is the appropriated status code to give when this parameter is missing from the request? 400 is the one? or should I respond with a 404?
我认为 404 是合适的
The 404 (Not Found) status code indicates that the origin server did
not find a current representation for the target resource or is not
willing to disclose that one exists.
您的路由实现恰好将 /search
和 /search?q=ok
发送到同一个处理程序这一事实并不意味着它们是相同的资源。 /search
标识资源,当前没有可用的表示,因此您将响应发回给消费者解释问题,并将 404 放入元数据中。
规范中的重要提示是:
A 404 response is cacheable by default
这让我们通知客户端(和任何中间组件)知道这个响应可以被重用。
它很有用 属性,但不适用于(开箱即用)400 Bad Request
启发式:您的网站 api 应该像文档存储一样工作。如果您要求文档商店给您一份文档,但您拼错了密钥,您会得到什么? KeyNotFound
异常的一些味道。如果您向 Web 服务器请求主目录中的文档,但您拼写的文件名不正确,您也会得到同样的结果。
响应的语义指示要使用的正确状态代码,而不是实现细节。
我有一个端点需要通过查询字符串(是 GET 动词)传递参数。
当请求中缺少此参数时,应提供什么适当的状态代码? 400是那个?还是我应该用 404 响应?
[GET /search?q=ok] => 200 OK
[GET /search] => 400 Bad Request? or 404 Not Found? Or 422 Unprocessable Entity? Others?
应该是 400 - 错误请求。
The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.
404 - 未找到
The HTTP 404 Not Found Error means that the webpage you were trying to reach could not be found on the server. It is a Client-side Error which means that either the page has been removed or moved and the URL was not changed accordingly, or that you typed in the URL incorrectly.
这意味着服务器无法找到您指定的 URI。但在您的情况下,URI 有效但缺少参数,因此 400 是正确的方法。
TLDR 这是 HTTP 400 - 错误请求。
这是一个 400
,因为用户没有发送 必填 输入字段。
为什么不是 422 - 因为这种情况适合 400
。请牢记您的消费者,如果您确实不需要,则不应使用不受欢迎的响应代码。
HTTP 404 案例:
1) Url 客户端请求的内容在您的服务器中不存在(通常这将由您的服务器处理。应用程序开发人员通常不需要做任何事情,除非您想要一个漂亮的 404 页面和 SEO 原因)。
2) 如果它是一个 path
参数并且客户端正在寻找具有 id 的实体(例如 (/students/{id}
并且您的应用程序找不到这样的实体,您可以响应一个 HTTP 404。
比方说,用户发送了查询参数,但您没有找到任何与查询参数匹配的项目,别搞错了,它仍然是一个 HTTP 200
,正文是一个空数组左右(不是 404,不像上例中提到)
What is the appropriated status code to give when this parameter is missing from the request? 400 is the one? or should I respond with a 404?
我认为 404 是合适的
The 404 (Not Found) status code indicates that the origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
您的路由实现恰好将 /search
和 /search?q=ok
发送到同一个处理程序这一事实并不意味着它们是相同的资源。 /search
标识资源,当前没有可用的表示,因此您将响应发回给消费者解释问题,并将 404 放入元数据中。
规范中的重要提示是:
A 404 response is cacheable by default
这让我们通知客户端(和任何中间组件)知道这个响应可以被重用。
它很有用 属性,但不适用于(开箱即用)400 Bad Request
启发式:您的网站 api 应该像文档存储一样工作。如果您要求文档商店给您一份文档,但您拼错了密钥,您会得到什么? KeyNotFound
异常的一些味道。如果您向 Web 服务器请求主目录中的文档,但您拼写的文件名不正确,您也会得到同样的结果。
响应的语义指示要使用的正确状态代码,而不是实现细节。