web-services - 我应该在 URL 中提供父资源名称,还是在 RESTful WS 中不提供?

标签 web-services rest restful-url

我正在使用 PHP 和 apache 开发一些基本的 Restful Web 服务,我想知道是否应该构建提供父实体名称的 URL。让我更好地解释一下:

我有 2 个实体,假设国家城市。我现在只提供 WS 来获取、创建、更新或删除城市,但 API 不支持通过 WS 操作国家。我正在使用 mod_rewrite 重新映射 url,并在 api 中提供以下 url 来操作城市:

. GET     /api/countries/<country_id>/cities            cities of country with id <country_id>

. GET     /api/countries/<country_id>/cities/<city_id>  city with id <city_id>

. POST    /api/countries/<country_id>/cities            add a city to country with id <country_id>

. PUT     /api/countries/<country_id>/cities/<city_id>  update the city whose country has id <country_id>

. DELETE  /api/countries/<country_id>/cities/<city_id>  delete city ...

我开始仔细查看这些网址,我很困惑是否应该提供父实体名称和 ID。我做了一个很好的假设,即城市不能分配给多个国家,即它不是一种多对多的关系。假设如此,我认为可以为许多 API 函数提供更短的 URL 模式。例如,如果客户想要删除某个城市,只要发送:

. DELETE /api/cities/14

我知道一个城市属于一个国家,客户端在发出请求之前不需要找出国家ID。

除了第一个(获取所有国家/地区的城市)之外,大多数网址都可以转换为这种较短的网址。

这是我第一次开发网络服务,我还没有读过太多相关内容,所以我可能误解了一些东西。我可以得到一些建议吗?非常感谢,并对我的英语水平感到抱歉。

EDIT1:我认为这个问题可以概括为“我应该如何处理 API url 中的实体关系?”

最佳答案

“我应该如何处理 API url 中的实体关系?”不。相反,请使用您回复的资源中的链接。

例如,如果我在 /cities/612 上执行 GET,我可能会返回

{ 'city': 
  {
    'id': 612,
    'self': '/cities/612',
    'name': 'Sydney',
    'country': { 'name': 'Australia', 'href': '/country/61' },
    'region': { 'name': 'Asia Pacific', 'href': '/region/12' },
    'delete': {
      'method': 'delete',
      'href': '/cities/612'
    },
    'update': {
      'method': 'put',
      'href': '/cities/612',
        ...
    },
    ...
  }
}

这使您可以拥有任何您喜欢的实体关系,而不必担心您的 URL。您还可以轻松添加新关系,而不会破坏现有客户。例如,如果您想添加“星球”的新关系,/cities/612 上的 GET 现在可能会提供

{ 'city': 
  {
    'id': 612,
    'self': '/cities/612',
    'name': 'Sydney',
    'country': { 'name': 'Australia', 'href': '/country/61' },
    'region': { 'name': 'Asia Pacific', 'href': '/region/12' },
    'planet': { 'name': 'Earth', 'href': '/planet/1' },
    'delete': {
      'method': 'delete',
      'href': '/cities/612'
    },
    'update': {
      'method': 'put',
      'href': '/cities/612',
        ...
    },
    ...
  }
}

看看A RESTful Hypermedia API in Three Easy Steps了解更多详情。

关于web-services - 我应该在 URL 中提供父资源名称,还是在 RESTful WS 中不提供?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9488184/

相关文章:

c# - 如何让 WCF 服务运行在 SSL 上?

javascript - 获取具有大量参数的 RESTful 列表

RESTful API - 设计子资源

node.js - node-soap - 调用函数的正确方法

java - 没有 WS-Addressing 的异步 Web 服务

java - 用于处理异步 HTTP 请求/响应的体系结构 : ESB vs Async Http Client library

Python requests.post() 返回 None

node.js - 是否有 RESTful 资源的客户端管理面板框架之类的东西?

rest - 带有查询参数的golang Chi路由器不起作用

java - HATEOAS 和 API 的动态发现