我应该在RESTful WS中提供URL中的父资源名称吗?

时间:2012-02-28 19:12:49

标签: web-services rest restful-url

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

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

. 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。

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

这是我第一次开发Web服务,我没有读过太多关于它的内容,所以我可能误解了一些东西。我可以请一些建议吗?非常感谢,抱歉我的基本英语。

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

1 个答案:

答案 0 :(得分:3)

'我应该如何处理API网址中的实体关系?'别。而是使用您回复的资源中的链接。

例如,如果我在/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',
        ...
    },
    ...
  }
}

这使您可以拥有自己喜欢的任何实体关系,而无需担心自己的网址。您可以轻松添加新关系,而不会破坏现有客户端。例如,如果你想添加一个新的'planet'关系,/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