在 REST 服务中返回真/假?
Posted
技术标签:
【中文标题】在 REST 服务中返回真/假?【英文标题】:Returning true/false in REST service? 【发布时间】:2011-08-14 18:55:01 【问题描述】:我正在设计一个 REST 服务,需要检查地址是否输入正确。我正在考虑的是如何设计一个 REST 接口来检查完整的街道地址是否有效。
我有这个 /address 服务,例如,我可以做一个 POST /address/validation
,它返回一个 xml/json 真或假,但对我来说这似乎很不符合 REST 风格。
另一种方法是执行GET /address?street=xxx&nr=xxx&zipcode=xxx
(以及更多参数),如果正确则返回 200 OK,如果不正确则返回 404 Not found,这可能更符合 REST 标准?
我开始做选项 1),但我越想,选项 2) 使用 GET 感觉更好......
想法?
【问题讨论】:
【参考方案1】:从 RESTful 的角度来看,您实际上是在返回一个新资源,称为 AddressValidation,它将包含您的真值或假值。因此,一种方法是对/addressvalidation?street=xxx
等进行 POST。我可以将结果作为 JSON 返回或使用状态码。不过,我不确定 404 是否合适;你可能想看看this discussion of validation return status codes。
我对@987654323@ 方法有同样的问题,就像你提出的那样。对我来说,如果它返回 404,这意味着实际上找不到地址(即数据库中不存在),而不是它是无效的(例如,邮政编码是无效格式;不可能有任何这样的地址)。再次,请参阅链接的讨论;似乎 400 是更合适的响应。
【讨论】:
谢谢雅各布。我们实际上要在这里测试两件事——地址格式是否正确,然后我们检查地址是否真的存在。正如你所说,这是两个不同的东西,应该返回不同的代码/数据。【参考方案2】:怎么样?
GET /addressValidity?street=xxx&nr=xxx&zipcode=xxx
=>
200 OK
Content-Type: text/plain
true
【讨论】:
谢谢达雷尔,它很简单,我喜欢它。但是,它超出了我们总是返回 xml 或 json 依赖于接受标头的正常行为。 @Johan 显然你可以使用任何你喜欢的媒体类型。 Text/plain 非常适合返回简单的标量值。不幸的是,当前对“xml 或 json”的痴迷确实失去了 REST 所带来的一些好处,因为它能够使用许多不同的媒体类型。 可以返回一个对象,比如 "result": true
@JohnHenckel 说您可以通过 HTTP 返回一个“对象”是不够的,因为对象的定义取决于编程语言、平台或媒体类型规范。您展示的是一个 JSON 表示,其中包含 JSON 定义为对象的内容。你可以回来。这是矫枉过正,但它会工作。【参考方案3】:
我觉得做 POST 并返回状态码(如果正确,则返回 200 OK,如果不正确,则返回 404 Not found)更安静。因为你没有得到一些 GET 看起来不合适的东西。您正在向服务器发布一些信息,它会进行一些处理(验证)并返回一些响应。
【讨论】:
如果你问我,POST 看起来没有任何好处。 RFC 声明“POST 方法用于请求源服务器接受请求中包含的实体作为请求行中的请求 URI 标识的资源的新下级” 这种情况下Get比POST好,因为操作是幂等的以上是关于在 REST 服务中返回真/假?的主要内容,如果未能解决你的问题,请参考以下文章