你没有正确使用 HTTP 状态代码
HTTP 状态代码就像我们请求或与服务器上的资源交互时从服务器返回的短消息。它们是诊断应用程序错误并帮助快速修复错误的宝贵工具。
每个 HTTP 状态代码都有其特定且独特的含义,然而,有时开发人员可能会将某个状态代码的用途与另一个用途几乎相似的状态代码混淆。在本文中,我们将讨论开发人员在使用 HTTP 状态代码时常犯的一些错误。
无效数据的 HTTP 状态代码:400 和 422
为了理解这两个状态码的区别,我们假设这样一种情况:你在请求正文中传递了字符串值“password”作为密钥密码,但开发人员已在服务器端将此字符串值列入黑名单,以防止用户将其用作密码。在这种情况下,响应状态码应该返回什么:400 还是 422?
如果您当时想到的是 400,那么让我们仔细想一想。您向 API 端点传递了一个字符串值,该端点期望一个字符串值,但该字符串值包含已被列入黑名单的数据,或者说,不满足服务器进一步处理的条件。因此,请求的语法并没有错,所以我们不能返回 400 状态码来表示请求错误。根据 w3.org 的定义,“400 Bad Request” 的含义是:
由于语法错误,服务器无法理解该请求。客户端不应重复发送该请求。
因此,在这种情况下,我们可以使用状态码“422 无法处理实体”。这意味着服务器理解你正在尝试做什么,也理解你提交的数据,但它只是不允许进一步处理这些数据。
422(无法处理的实体)状态代码表示服务器识别了请求的实体的内容类型,但无法处理其中包含的指令。
在 XML 请求主体包含格式正确、语法正确的 XML 但语义错误等错误情况下,可能会返回状态代码 422。
处理禁止的 RESTful 请求:401、403 和 404
为了解释这个问题,假设我们的系统中有两个用户:ID 为 4 的 Sam 和 ID 为 7 的 Rick。假设 Sam 尝试进行授权 API 调用来查看 Rick 的个人资料资源,如下所示:
GET /users/7/profile HTTP/1.1
Authorization: Basic YmVuK2F206dGVzdA==
Accept: application/json
在这里,Sam 使用基本授权来表明自己是 Sam,但他正在拨打电话访问另一个人的个人资料,并且我们假设用户只能在此应用程序中读取他或她自己的个人资料。
那么这里的问题是应该返回什么状态码?最合适的可能是:
Sam 无权查看 Rick 的个人资料,所以出现“401 未授权”?
Sam 被禁止查看其他人的个人资料,所以是“403 禁止”?
Sam 不能简单地查看他无权查看的资源,所以出现“404 Not Found”?
但是,如果您返回 401 或 403,则会泄露安全信息,因为在这两种情况下,我们都声明了资源存在,但您无法查看,从而验证了资源的存在。那么,在这种情况下我们可以使用 404 吗?让我们看看会发生什么。
“403 Forbidden”的描述是这样的:
服务器理解了请求,但拒绝执行。授权无效,该请求不应重复。
如果请求方法不是 HEAD,并且服务器打算公开请求未完成的原因,则实体应该指定拒绝的原因。
如果服务器不希望客户端获取此信息,则可以改用状态代码 404(未找到)。
好了,问题应该解决了。如果你不想暴露信息,应该返回“404 Not Found”。
空资源 HTTP 状态代码:200 vs 204 vs 404
为了说明这一点,假设有一种方法 GET /users 返回所有用户的列表,而 GET /users?name=sam 仅返回名为 sam 的用户列表。如果没有名为 Sam 的用户,应该发出什么 HTTP 状态码?
第一个也是最有可能的选项是 200 Success,因为请求成功并返回一个空列表。它可能声明 /users collection/list 资源存在,并且 name 查询参数用于过滤列表内容。
但是,“204 无内容”状态代码定义如下:
204(无内容)状态代码表示服务器已成功完成请求,并且响应有效负载主体中没有其他内容需要发送。
虽然 200 OK 是常见且可接受的答案,但如果没有任何内容可返回,则 204 No Content 可能更有意义。它最常用于响应 PUT(替换)或 PATCH(部分更新),当服务器不希望交付被替换/更新的资源时;或者用于响应 DELETE,因为删除后通常没有任何内容可返回。然而,它也可以在 GET 操作中使用。
如果请求有效、已正确完成、并且没有更多信息需要发送(这是因为返回的列表为空),则答案 204 No Content 是可以理解且有效的。
但是,404 Not Found 状态代码的定义如下:
404(未找到)响应代码表示原始服务器无法找到所请求资源的当前表示或不愿意透露其存在。
假设 /users 是执行 GET /users?name=sam 时使用的资源,并且获取 404 HTTP 状态代码是没有意义的,因为资源 /users 存在,只是它包含的列表可能为空。
本文到此结束;请分享您遇到的其他疑惑用例以及解决方法。希望本文对您有所帮助。
继续阅读!
文章来源:https://dev.to/pragativerma18/youre-not-using-http-status-codes-right-pc6