RESTを実装しようとすると、RESTに関連するいくつかの概念が頭の中で競合します。
ビジネスロジックを保持するRESTフルバックエンドAPIシステムと、UIを提供するWebアプリケーションがあります。RESTに関するさまざまなリソース(特に、REST in Practice:Hypermedia and Systems Architecture)から、エンティティの生の識別子を公開せず、でハイパーリンクを返す必要があることを知っていrel="self"
ます。
例を考えてみましょう。REST APIには、人を返すリソースがあります。
<Person>
<Links>
<Link rel="self" href="http://my.rest.api/api/person/1234"/>
</Links>
<Pets>
<Link rel="pet" href="http://my.rest.api/api/pet/678"/>
</Pets>
</Person>
問題はWebアプリケーションで発生します。ブラウザへのハイパーリンクを含むページを返すと仮定しましょう:
<body class="person">
<p>
<a href="http://my.web.app/pet/???????" />
</p>
</body>
href
属性に何を入れるべきですか?ユーザーがターゲットページを開いたときにエンティティを取得できるように、WebアプリケーションにAPIエンティティURLを保持するにはどうすればよいですか?
要件は矛盾しているようです:
- ハイパーリンク
href
は、UIをホストするシステムであるため、Webアプリケーションにつながるはずです href
ウェブアプリが対象ページが開いたときに、エンティティに対処することができなければならないので、エンティティのいくつかのIDを持っている必要があります- WebアプリはRESTに対応していないため、REST URLを解析/構築しないでください。
URIは消費者に対して不透明でなければなりません。URIの発行者だけが、それを解釈してリソースにマップする方法を知っています。
その1234
ため、RESTfulクライアントとしてのように扱う必要があるため、API応答URLから取得することはできませんhttp://my.rest.api/api/AGRIDd~ryPQZ^$RjEL0j
。一方、WebアプリにつながるURLを指定する必要があり、アプリが何らかの方法でAPIの元のURLを復元し、そのURLを使用してAPIリソースにアクセスするには十分です。
最も簡単な方法は、おそらくリソースのAPI URLを文字列識別子として使用することです。しかし、そのようなWebページのURL http://my.web.app/person/http%3A%2F%2Fmy.rest.api%2Fapi%2Fperson%2F1234
は見苦しいです。
デスクトップアプリや単一ページのjavascriptアプリにとっては、すべて簡単に思えます。彼らは継続的に生きているので、アプリケーションの存続期間中、サービスオブジェクトとともにURLをメモリに保持し、必要なときにそれらを使用することができます。
Webアプリでは、いくつかのアプローチを想像できますが、すべてが奇妙に見えます:
- API URLのホストを置き換えて、結果のみを保持します。大きな欠点は、APIが生成するURLを処理するためにWebアプリケーションが必要になることです。つまり、巨大な結合を意味します。さらに、私のWebアプリがURLの解釈を開始するため、再びRESTfulではありません。
- REST APIで生のIDをリンクとともに公開し、それらを使用してWebアプリのURLを作成し、WebアプリサーバーでIDを使用してAPIで必要なリソースを見つけます。これは優れていますが、Webアプリはブラウザーからの要求を処理するために何らかのフォームのget-by-id要求のチェーンを発行するRESTサービスナビゲーションを通過する必要があるため、Webアプリサーバーのパフォーマンスに影響します。ある程度ネストされたリソースの場合、これにはコストがかかる場合があります。
self
APIから返されたすべてのURLをWebアプリサーバーの永続的な(DB?)マッピングに保存します。それらのIDを生成し、IDを使用してWebアプリページのURLを構築し、RESTサービスリソースのURLを取得します。つまり、http://my.rest.api/pet/678
URLを新しいキー(たとえば3
)で保持し、WebページのURLをとして生成しますhttp://my.web.app/pet/3
。これは、ある種のHTTPキャッシュ実装のように見えます。理由はわかりませんが、奇妙に思えます。
または、それはすべて、RESTful APIがWebアプリケーションのバックエンドとして機能できないことを意味しますか?