RESTfulプログラミングとは一体何でしょうか?質問する

RESTfulプログラミングとは一体何でしょうか?質問する

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+userdbapplication/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、、など)を使用していること、およびクライアント側で想定している唯一の知識はメディア定義であることに注意してください。PUTPOSTDELETE

参考文献:

(この回答は、要点を見逃しているとしてかなりの批判を受けています。大部分は正当な批判です。私が最初に説明したことは、REST の本当の意味というよりも、私がこれを最初に書いた数年前に REST が通常どのように実装されていたかに沿ったものでした。私は、本当の意味をよりよく表すように回答を修正しました。)

おすすめ記事