2

PHP と apache を使用していくつかの基本的な安らかな 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 ...

私はこれらの URL を慎重に調べ始めましたが、親エンティティの名前と ID を提供する必要があるかどうかについて混乱しました。私は、都市を複数の国に割り当てることはできない、つまり多対多の関係ではないという大きな仮定を立てています。これを仮定すると、多くの API 関数に短い URL パターンを提供できると思います。たとえば、クライアントが都市を削除したい場合は、次のように送信すれば十分です。

. DELETE /api/cities/14

都市が 1 つの国に属していることはわかっており、クライアントはリクエストを行う前に国 ID を調べる必要はありません。

最初の URL (すべての国の都市を取得する) を除いて、ほとんどの URL はこの短い種類の URL に変換できます。

Web サービスを開発するのはこれが初めてで、それについてあまり読んでいないので、おそらく何か誤解している可能性があります。アドバイスをお願いできますか?初歩的な英語で申し訳ありません。

EDIT1: 質問は「API URL でエンティティ関係を処理するにはどうすればよいですか?」で一般化できると思います。

4

1 に答える 1

3

「API 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' },
    'delete': {
      'method': 'delete',
      'href': '/cities/612'
    },
    'update': {
      'method': 'put',
      'href': '/cities/612',
        ...
    },
    ...
  }
}

これにより、URL を気にすることなく、好きなエンティティ関係を持つことができます。また、既存のクライアントを壊すことなく、新しい関係を簡単に追加できます。たとえば、「planet」という新しい関係を追加したい場合、GET onは次/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',
        ...
    },
    ...
  }
}

詳細については、A RESTful Hypermedia API in Three Easy Stepsをご覧ください。

于 2012-02-29T06:38:44.330 に答える