Должен ли я указывать имя родительского ресурса в URL или нет в RESTful WS? - PullRequest
2 голосов
/ 28 февраля 2012

Я разрабатываю некоторые базовые полноценные веб-сервисы с использованием PHP и apache, и мне интересно, должен ли я создавать URL-адреса, предоставляющие имя родительского объекта или нет. Позвольте мне объяснить это лучше:

У меня есть 2 объекта, предположим, страны и города . Сейчас я просто предоставляю WS для получения, создания, обновления или удаления городов , но API не будет поддерживать манипуляции стран через WS. Я переназначаю URL-адреса, используя mod_rewrite , и я предоставляю следующие URL-адреса в 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 ...

Я начал внимательно присматриваться к этим URL-адресам и запутался, нужно ли указывать имя и идентификатор родительского объекта или нет. Я полагаю, что города нельзя назначать более чем в одну страну, т. Е. Это не отношения «многие ко многим». Предполагая это, я думаю, что более короткий шаблон URL может быть предоставлен для многих функций API. Например, если клиент хочет удалить какой-то город, будет достаточно, если он отправит:

. DELETE /api/cities/14

Я знаю, что город принадлежит одной стране, и клиенту не нужно узнавать идентификатор страны, прежде чем сделать запрос.

Большинство URL-адресов могут быть преобразованы в этот более короткий вид URL, за исключением первого (получить все города страны).

Это мой первый раз, когда я разрабатываю веб-сервисы, и я не слишком много об этом читал, поэтому, возможно, я что-то неправильно понимаю. Могу ли я получить совет? Большое спасибо и извините за мой элементарный английский.

РЕДАКТИРОВАТЬ1: Я думаю, что вопрос можно обобщить в «Как я должен обрабатывать отношения сущностей в URL-адресах API?»

1 Ответ

3 голосов
/ 29 февраля 2012

'Как мне обрабатывать отношения сущностей в URL-адресах API?'Не.Вместо этого используйте ссылки в ресурсах, на которые вы отвечаете.

Например, если я сделаю GET на /cities/612, я могу получить обратно

{ '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.Вы также можете легко добавлять новые отношения, не нарушая существующих клиентов.Например, если вы хотите добавить новое отношение «планета», GET на /cities/612 теперь может обеспечить

{ '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',
        ...
    },
    ...
  }
}

Взгляните на RESTful Hypermedia API в трех простых шагах для более подробной информации.

...