我会说,两者都不合适。
如前所述——例如@anneb,我也认为部分问题来自使用 HTTP 响应代码来传输与 RESTful 服务相关的状态。 REST 服务必须说明的任何关于其自身处理的内容都应通过 REST 特定代码进行传输。
1
我认为,如果 HTTP 服务器发现任何准备好响应它发送的请求的服务,它不应该以 HTTP 404 响应——最后,服务器发现了某些东西——除非被告知由处理请求的服务显式处理。
让我们暂时假设以下 URL:http://example.com/service/return/test。
- 案例 A 是服务器“只是在文件系统上查找文件”。如果不存在,
404 是正确的。如果它要求某种服务准确地传递此文件并且该服务告诉它不存在该名称的任何内容,则也是如此。
- 在情况 B 中,服务器不使用“真实”文件,但实际上请求由其他服务处理 - 例如。某种模板系统。在这里,服务器不能对资源的存在提出任何声明,因为它对此一无所知(除非处理它的服务告知)。
如果服务没有任何明确要求不同行为的响应,HTTP 服务器只能说 3 件事:
-
503 如果应该处理请求的服务没有运行或响应;
-
200 否则,因为 HTTP 服务器实际上可以满足请求 - 无论服务稍后会说什么;
-
400 或 404 表示没有此类服务(与“存在但离线”相反)并且没有找到其他服务。
2
回到手头的问题:我认为最简洁的方法是不使用 HTTP 任何响应代码,而不是之前所说的。如果服务存在且响应,则 HTTP 代码应为 200。
响应应该包含服务返回的状态在一个单独的标头中——在这里,服务可以说
-
REST:EMPTY 例如如果被要求搜索某事。而那项研究却空无一物;
-
REST:NOT FOUND 如果是专门要求的。 “ID-like”——是一个文件名或一个 ID 或条目号 24 等的资源——并且未找到该特定资源(通常,请求了一个特定资源但未找到);
-
REST:INVALID 如果发送的请求的任何部分未被服务识别。
(请注意,我在它们前面加上了“REST:”,目的是为了标记这样一个事实,即虽然它们可能与 HTTP 响应代码具有相同的值或措辞,但它们是……完全不同的)
3
让我们回到上面的 URL 并检查案例 B,其中 service 向 HTTP 服务器指示它自己不处理此请求,而是将其传递给 SERVICE。 HTTP 只提供由SERVICE 交回的内容,它对return/test 部分一无所知,因为它由SERVICE 处理。如果该服务正在运行,HTTP 应该返回 200,因为它确实找到了一些东西来处理请求。
SERVICE 返回的状态(如上所述,希望在单独的标题中看到)取决于实际预期的操作:
- 如果
return/test请求特定资源:如果存在,返回状态为REST:FOUND;如果该资源不存在,则返回REST:NOT FOUND;如果我们知道它曾经存在并且不会返回,这可以扩展为返回 REST:GONE,如果我们知道它已经进入好莱坞,则可以扩展为 REST:MOVED
- 如果
return/test被认为是搜索或类似过滤的操作:如果结果集为空,则返回请求类型的空集,状态为REST:EMPTY;请求类型的一组结果,状态为REST:SUCCESS
- 如果
return/test 不是SERVICE 识别的操作:如果完全错误则返回REST:ERROR(例如retrun/test 之类的拼写错误),或者REST:NOT IMPLEMENTED 以防它计划在以后使用。李>
4
这种区别比将两种不同的东西混合起来要清晰得多。如果有的话,它还会使调试更容易,处理也只会稍微复杂一些。
- 如果返回 HTTP 404,服务器会告诉我,“我不知道你在说什么”。虽然我的请求的 REST 部分可能完全没问题,但我在所有错误的地方寻找 par'Mach。
- 另一方面,HTTP 200 和 REST:ERR 告诉我我得到了服务,但在我对服务的请求中出现了错误。
- 通过 HTTP 200 和 REST:EMPTY,我知道我没有做错任何事情 - 正确的服务器,服务器找到了服务,对服务的正确请求 - 但搜索结果为空。
总结
问题和讨论源于这样一个事实,即 HTTP 响应代码被用来表示服务的状态,其结果由 HTTP 提供服务,或者表示某事。这不在 HTTP 服务器本身的范围内。
由于这种差异,无法回答问题,所有意见都需要进行大量讨论。
由服务而不是 HTTP 服务器处理的请求状态真的不应该 (RFC 6919) 由 HTTP 响应代码给出。 HTTP 代码应该 (RFC 2119) 只包含 HTTP 服务器可以在其自身范围内提供的信息:即,是否找到服务来处理请求。
相反,应该使用一种不同的方式来告诉消费者关于实际处理请求的服务的请求状态。我的建议是通过一个特定的标题来做到这一点。理想情况下,标头的名称及其内容都遵循使消费者可以轻松处理这些响应的标准。