如果电子邮件(或其他东西)存在,我应该 return 哪个 HTTP 响应?
Which HTTP response should I return if email (or something else) exist?
在 symfony 中 api REST,
现在我这样做:
//mail exist:
$this->json("", Response::HTTP_OK) //200
//mail does not exist:
$this->json("", Response::HTTP_BAD_REQUEST) //400
但我想知道这样做是否更好:
$this->json("email exist", Response::HTTP_OK) //200
$this->json("email does not exist", Response::HTTP_OK) //200
适当的响应代码应该是 409 Conflict
HTTP 具有适用于两种情况的错误代码:
200 如果存在并且您 return 内容,204 如果它存在并且响应中没有内容。
404 如果请求的实体不存在且从未存在过,410 如果它以前存在但现在消失了。
在 REST 中,uris 代表实体,因此请求的 HTTP 状态应该代表实体的状态。在这两种情况下都返回 200 会破坏该逻辑。
I'm wondering if it's not better to do:
$this->json("email exist", Response::HTTP_OK) //200
$this->json("email does not exist", Response::HTTP_OK) //200
当然可以。
状态代码是 transfer of documents over a network 域中的元数据。它们供通用组件(Web 浏览器、缓存)使用,用于识别 HTTP 响应的语义。
200 OK,响应 GET 请求,告诉我们网络服务器能够找到您请求的文档的副本,并且该文档的副本包含在响应。
它没有说明该文档在您的业务领域中的含义是好消息还是坏消息。您要的文件,这里是最新的副本。
想象一下,如果您愿意的话,您的 Web 内容包含一个包含以下内容的文本文件
email does not exist
当有人索要该文本文件的副本时,您使用什么状态代码? 200,当然 - 我们能够以他们要求的文档副本作为回应,并且以正确的方式表明在通过网络域传输文档时状态正常。
我们使用的状态代码并不会因为底层实现细节的改变而改变——从文件系统中提取文件的副本,从数据库中提取文件的副本,从数据库中提取一些参数数据库并使用它们生成文件副本都是实现细节,我们故意将其隐藏在网络服务器外观之后。
换句话说:HTTP 没有提供关于您的资源模型应该是什么的坚定指南;它只定义了我们用来共享资源模型信息的消息的语义
GET /documents?email=abuse@example.org
由您决定请求目标标识的是什么资源,它是否具有当前条件下的当前表示,等等。所以你真的可以发回你想要的任何东西——然后选择与你的响应消息的语义相匹配的状态代码
但是...
在很多情况下,人们假设状态代码是业务语义的反映;因此您可能不得不妥协您认为的“理想”以便与其他组件互操作。
一个例子是“健康检查”。如果我要求一份描述服务器健康状况的文档,并且服务器能够为我提供该文档的当前副本,状态代码应该是 200。但是,如果您查看 Consul 的文档,你会发现
The status of the service depends on the HTTP response code: any 2xx code is considered passing, a 429 Too ManyRequests is a warning, and anything else is a failure.
他们要求您将文档的含义提升到通过网络元数据传输的文档中,这不是真正正确的事情[tm](标准化表示或 link 关系将是更合适)。
就是说,如果您愿意按照他们的规则行事,它就会奏效,并且按照他们的方式行事可以节省您编写自己的 Consul 实现的工作。
在 symfony 中 api REST,
现在我这样做:
//mail exist:
$this->json("", Response::HTTP_OK) //200
//mail does not exist:
$this->json("", Response::HTTP_BAD_REQUEST) //400
但我想知道这样做是否更好:
$this->json("email exist", Response::HTTP_OK) //200
$this->json("email does not exist", Response::HTTP_OK) //200
适当的响应代码应该是 409 Conflict
HTTP 具有适用于两种情况的错误代码:
200 如果存在并且您 return 内容,204 如果它存在并且响应中没有内容。
404 如果请求的实体不存在且从未存在过,410 如果它以前存在但现在消失了。
在 REST 中,uris 代表实体,因此请求的 HTTP 状态应该代表实体的状态。在这两种情况下都返回 200 会破坏该逻辑。
I'm wondering if it's not better to do:
$this->json("email exist", Response::HTTP_OK) //200 $this->json("email does not exist", Response::HTTP_OK) //200
当然可以。
状态代码是 transfer of documents over a network 域中的元数据。它们供通用组件(Web 浏览器、缓存)使用,用于识别 HTTP 响应的语义。
200 OK,响应 GET 请求,告诉我们网络服务器能够找到您请求的文档的副本,并且该文档的副本包含在响应。
它没有说明该文档在您的业务领域中的含义是好消息还是坏消息。您要的文件,这里是最新的副本。
想象一下,如果您愿意的话,您的 Web 内容包含一个包含以下内容的文本文件
email does not exist
当有人索要该文本文件的副本时,您使用什么状态代码? 200,当然 - 我们能够以他们要求的文档副本作为回应,并且以正确的方式表明在通过网络域传输文档时状态正常。
我们使用的状态代码并不会因为底层实现细节的改变而改变——从文件系统中提取文件的副本,从数据库中提取文件的副本,从数据库中提取一些参数数据库并使用它们生成文件副本都是实现细节,我们故意将其隐藏在网络服务器外观之后。
换句话说:HTTP 没有提供关于您的资源模型应该是什么的坚定指南;它只定义了我们用来共享资源模型信息的消息的语义
GET /documents?email=abuse@example.org
由您决定请求目标标识的是什么资源,它是否具有当前条件下的当前表示,等等。所以你真的可以发回你想要的任何东西——然后选择与你的响应消息的语义相匹配的状态代码
但是...
在很多情况下,人们假设状态代码是业务语义的反映;因此您可能不得不妥协您认为的“理想”以便与其他组件互操作。
一个例子是“健康检查”。如果我要求一份描述服务器健康状况的文档,并且服务器能够为我提供该文档的当前副本,状态代码应该是 200。但是,如果您查看 Consul 的文档,你会发现
The status of the service depends on the HTTP response code: any 2xx code is considered passing, a 429 Too ManyRequests is a warning, and anything else is a failure.
他们要求您将文档的含义提升到通过网络元数据传输的文档中,这不是真正正确的事情[tm](标准化表示或 link 关系将是更合适)。
就是说,如果您愿意按照他们的规则行事,它就会奏效,并且按照他们的方式行事可以节省您编写自己的 Consul 实现的工作。