8.1 リモート API アプローチ
すべてのプログラマは、クライアント/サーバー アーキテクチャを構築するときに同じ間違いを犯します。サーバーへのリクエストをメソッド呼び出しとして処理し始めます。
サーバー上でレポート生成プロセスを開始したい場合は、次のようなリクエストを送信してみてはいかがでしょうか。
http://server.com/startDocumentGeneration?params
また、完了後にレポートをダウンロードするにはどうすればよいでしょうか? これを行うために、別のメソッドを作成します。
http://server.com/getDocument
サーバーはHttpSession
ドキュメントに関する情報を保存しており、ドキュメントが生成されるとすぐにサーバーから情報が返されます。
素晴らしいアプローチ。か否か?
アプローチは本当にひどいです。問題は、サーバーが文書番号を記憶しておく必要があるということです。つまり、新しいメソッド呼び出しを適切に処理するには、サーバーは以前のメソッド呼び出しの結果を記憶しておく必要があります。
ウェブ上では、これは大きな問題です。インターネットが消えたり、ブラウザが閉じたりする可能性があります。ページがリロードされたり、リンクが誤ってクリックされたりする可能性があります。そして、サーバーは以前のユーザーリクエストからのメガバイトのデータを保存し続けます...
サーバーを快適に操作するには、サーバーに対する以前のリクエストのデータが常に手元にあることを期待することはできません。
では、サーバーのメソッドを呼び出すにはどうすればよいでしょうか? 正しい答えは恐ろしいものです。「そんなはずはない!」
8.2 REST アプローチ
プログラマは基本に立ち返り、最初はリクエストにサーバー上のファイルへのパスが含まれていることを思い出しました。
http://server.com/path?params
そして私たちはこのアプローチを最大限に活用することにしました。
ここで、サーバーは、ツリー形式で外部から見えるデータのリポジトリと見なされます。
すべてのユーザーのリストを取得したい場合は、次のクエリを呼び出します。
http://server.com/users
ユーザー 113 のデータを取得したい場合は、次のクエリを実行します。
http://server.com/users/113
などなど、すべて同じ調子です。
もう一度言いますが、サーバーは、ツリーの形で外部から見えるデータのリポジトリとして見なされます。
データは、 GETリクエスト、変更されたPOSTリクエスト、および削除されたDELETEリクエストで受信できます。
8.3 状態なし
クライアントとサーバー間の対話の REST プロトコルでは、次の条件が必要です。クライアントからのリクエスト間の期間中、クライアントの状態に関する情報はサーバーに保存されません。
クライアントからのすべてのリクエストは、サーバーがリクエストを満たすために必要なすべての情報を毎回受信できるように作成する必要があります。セッション状態はクライアント側に保存されます。
クライアント要求の処理中、クライアントは移行状態にあるとみなされます。個々のアプリケーションの状態は、次回クライアントがヒットしたときに呼び出すことができるリンクによって表されます。
8.4 界面の均一性
サーバーからオブジェクトを取得するために使用されるすべてのパスは標準化されています。これは、特に他の REST サーバーからデータを取得する場合に非常に便利です。
すべてのオブジェクト インターフェイスは、次の 3 つの条件に準拠する必要があります。
リソースの識別
すべてのリソースは、リクエスト内で URI を使用して識別されます。サーバー内のリソースは、クライアントに返されるビューとは別のものです。たとえば、サーバーはデータベースからデータを HTML、XML、または JSON として送信することがありますが、いずれもサーバー内のストレージ タイプではありません。
ビューを介したリソースの操作
クライアントがメタデータを含むリソースの表現を保存している場合、サーバー上のリソースを変更または削除するのに十分な情報が含まれています。
「自己記述型」メッセージ
各メッセージには、その処理方法を理解するのに十分な情報が含まれています。たとえば、ユーザーに関する情報が必要な場合、サーバーは名前と住所のフィールドがある JSON オブジェクトを返します。
クライアントが、応答の最初の数字が年齢で、2 番目の数字が生年月日であることを知る必要がある状況があってはなりません。
8.5 キャッシュ
REST アプローチでは、データ要求が HTTP プロトコル経由で行われることを前提としています。したがって、オブジェクトは GET リクエストを呼び出すことによって取得されます。これは、GET リクエストを介して受信したすべてのリソースと同様に、HTTP リソースをキャッシュするためのすべてのルールが適用されることを意味します。
つまり、REST API 経由で受信したデータは、Web サーバー上の静的リソースと同じ方法でキャッシュされます。美しさ :)
GO TO FULL VERSION