1

我正在寻找一种将搜索表示为 RESTful uri 的正确方法。

我有两个模型:国家和国家,国家有一个集合国家。

用 id 或 name 属性表示搜索国家/地区的正确方法是什么?

api/countries/1/id

api/countries/Italy/name

或者

api/countries?id=1

api/countries?name=Italy

另外,如果我想查看状态列表?

api/countries/1/id/states

api/countries/Italy/name/states

谢谢

4

4 回答 4

1

对于这两个模型,即。 countries并且states,我认为遵循 Uri 模式将是最合适的。

  1. 所有国家 : api/country
  2. 具体国家:api/country/{England}
  3. 所有国家:api/country/{England}/State
  4. 具体状态:api/country/{England}/State/{Berkshire}

在上面的例子中,里面{}的值代表变量。

于 2013-03-09T12:36:40.080 回答
0

这取决于你的口味。两种变体都可以。

对于状态,可以创建新端点

api/states/name/Italy
于 2013-03-09T11:32:46.083 回答
0

您在 REST URL 中使用名称的方法是错误的。该名称只是国家的一个属性,而不是子资源,这意味着您不应该在 URL 中看到它。但是,可以选择将其用作键,在这种情况下,可以使用名称的代替 ID。

api/countries/Italy

我认为您想要实现的是过滤字段,即仅获取名称:

api/countries/Italy/states?fields=name

或者,如果您预定义了一些格式

api/countries/Italy/states?format=onlyName
于 2014-06-24T06:35:52.413 回答
0

用 id 或 name 属性表示搜索国家/地区的正确方法是什么?

tl; dr:变体一是混淆的秘诀。如果必须选择,请使用查询字符串进行搜索


就 REST 宣言而言,URI 逻辑只是一个实现细节——唯一需要关注的是该位置的访问机制不能随着时间的推移而中断。内容可能被清空或移动 - 但 URI 必须始终以服务端点结束,该端点为客户端提供他们理解并可以采取行动的预响应(即 3** 重定向或客户端的超媒体重新发现)。

然而,许多成功且设计良好的 API 都试图公开内在一致的逻辑,旨在变得直观可探索。因此,关于开发人员的经验和市场成功,您的第一个示例 api/countries/1/id 实际上是不好的,因为它使用起来令人困惑:

  1. 通过查看 URI,您没有任何线索表明您正在运行(可能是 CPU/内存昂贵的)搜索而不是检索单个资源
  2. 许多公共 API 遵循资源层次结构和公开的 URI 之间的逻辑映射 - 因此常见的期望是api/countries/1/id检索{1}(作为无意义的查询)或api/countries/1/name给出{Italy}.

因此,查询字符串是一个很好的选择——尤其是提供搜索功能。从文字中可以看出含义;)

api/countries?name=Italy 
api/countries?q=name(Ital*)              // same result
api/countries?q=isoCode=(IT)             // same result

--> api/countries/1/states               // list all states of Italy
    api/states?q=country/name(Italy)     // - same -
    api/states?q=country/id(1)           // - same -

仅通过查看 URI 就可以预期请求的响应正文,这很好。更好的是:它有助于区分资源和视图。“视图”在查询字符串中定义,将其视为镜头或过滤器,通过它您可以查看相同资源(您的国家/地区集合)的摘录。

这种模式在这些方面同样出色,并且也很常见:

api/countries/search/Italy
api/countries/search/name=Italy
api/countries/search/isoCode=IT,name=*aly

选择此选项的原因可能与构建 API 时的实际实现细节有关——因为它将对资源的直接访问与搜索操作分开——满足请求所需的 CPU/内存以及响应计数和格式可能从根本上是不同的。

于 2014-07-20T23:01:32.740 回答