RESTful プログラミングとは一体何でしょうか?
ベストアンサー1
REST は、Web の基本的なアーキテクチャ原則です。Web の素晴らしい点は、クライアント (ブラウザ) とサーバーが、サーバーとサーバーがホストするリソースについて事前に何も知らなくても、複雑な方法で対話できることです。重要な制約は、サーバーとクライアントの両方が、使用するメディア(Web の場合はHTML)について同意する必要があることです。
RESTの原則に従う API では、クライアントが API の構造について何も知る必要はありません。むしろ、サーバーは、クライアントがサービスとやり取りするために必要な情報をすべて提供する必要があります。HTMLフォームはその一例です。サーバーはリソースの場所と必要なフィールドを指定します。ブラウザは、情報をどこに送信すればよいか、またどのような情報を送信すればよいかを事前に知りません。両方の形式の情報は、サーバーによって完全に提供されます。 (この原則は、HATEOAS : アプリケーション状態のエンジンとしてのハイパーメディア。
では、これはHTTPにどのように適用され、実際にどのように実装できるのでしょうか。 HTTP は動詞とリソースを中心に展開されます。主流として使用されている 2 つの動詞はGET
と でPOST
、これは誰もが知っていると思います。ただし、HTTP 標準では や など、他のPUT
動詞もいくつか定義されていますDELETE
。これらの動詞は、サーバーから提供された指示に従って、リソースに適用されます。
たとえば、Web サービスによって管理されているユーザー データベースがあるとします。このサービスでは、JSON に基づくカスタム ハイパーメディアを使用しており、これに mimetype を割り当てます(また、多くのメディア タイプがサポートされているapplication/json+userdb
場合もあります)。クライアントとサーバーはどちらもこの形式を理解するようにプログラムされていますが、お互いについて何も知りません。application/xml+userdb
application/whatever+userdb
ロイ・フィールディング指摘している:
REST API は、リソースを表現し、アプリケーションの状態を制御するために使用されるメディア タイプを定義すること、または既存の標準メディア タイプに対する拡張リレーション名やハイパーテキスト対応マークアップを定義することに、その記述作業のほぼすべてを費やす必要があります。
基本リソースのリクエストでは、/
次のような結果が返されます。
リクエスト
GET /
Accept: application/json+userdb
応答
200 OK
Content-Type: application/json+userdb
{
"version": "1.0",
"links": [
{
"href": "/user",
"rel": "list",
"method": "GET"
},
{
"href": "/user",
"rel": "create",
"method": "POST"
}
]
}
メディアの説明から、「リンク」と呼ばれるセクションから関連リソースに関する情報を見つけることができることがわかります。これは、ハイパーメディア コントロールと呼ばれます。この場合、そのようなセクションから、別のリクエストを行うことでユーザー リストを見つけることができることがわかります/user
。
リクエスト
GET /user
Accept: application/json+userdb
応答
200 OK
Content-Type: application/json+userdb
{
"users": [
{
"id": 1,
"name": "Emil",
"country: "Sweden",
"links": [
{
"href": "/user/1",
"rel": "self",
"method": "GET"
},
{
"href": "/user/1",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/1",
"rel": "delete",
"method": "DELETE"
}
]
},
{
"id": 2,
"name": "Adam",
"country: "Scotland",
"links": [
{
"href": "/user/2",
"rel": "self",
"method": "GET"
},
{
"href": "/user/2",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/2",
"rel": "delete",
"method": "DELETE"
}
]
}
],
"links": [
{
"href": "/user",
"rel": "create",
"method": "POST"
}
]
}
この応答から多くのことがわかります。たとえば、POST
次のように実行することで新しいユーザーを作成できることがわかりました/user
。
リクエスト
POST /user
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Karl",
"country": "Austria"
}
応答
201 Created
Content-Type: application/json+userdb
{
"user": {
"id": 3,
"name": "Karl",
"country": "Austria",
"links": [
{
"href": "/user/3",
"rel": "self",
"method": "GET"
},
{
"href": "/user/3",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/3",
"rel": "delete",
"method": "DELETE"
}
]
},
"links": {
"href": "/user",
"rel": "list",
"method": "GET"
}
}
既存のデータを変更できることもわかっています。
リクエスト
PUT /user/1
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Emil",
"country": "Bhutan"
}
応答
200 OK
Content-Type: application/json+userdb
{
"user": {
"id": 1,
"name": "Emil",
"country": "Bhutan",
"links": [
{
"href": "/user/1",
"rel": "self",
"method": "GET"
},
{
"href": "/user/1",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/1",
"rel": "delete",
"method": "DELETE"
}
]
},
"links": {
"href": "/user",
"rel": "list",
"method": "GET"
}
}
これらのリソースを操作するために異なる HTTP 動詞( GET
、、など)を使用していること、およびクライアント側で想定している唯一の知識はメディア定義であることに注意してください。PUT
POST
DELETE
参考文献:
- このページには、はるかに優れた回答が多数あります。
-
妻にRESTを説明した方法 。 - 妻にRESTを説明した方法。
- マーティン・ファウラーの考え
- PayPalのAPIにはハイパーメディアコントロールがある
(この回答は、要点を見逃しているとしてかなりの批判を受けています。大部分は正当な批判です。私が最初に説明したことは、REST の本当の意味というよりも、私がこれを最初に書いた数年前に REST が通常どのように実装されていたかに沿ったものでした。私は、本当の意味をよりよく表すように回答を修正しました。)