RESTfulプログラミングとは何でしょうか?

RESTfulプログラミングとは何でしょうか?

RESTは、Webの基本的なアーキテクチャ原理です。ウェブのすごいところは、クライアント(ブラウザ)とサーバーが、サーバーやサーバーがホストするリソースについてクライアントが事前に何も知らなくても、複雑な方法で相互に作用できるという点です。重要な制約は、サーバーとクライアントの両方が使用するメディアに同意しなければならないことです。

RESTの原則に準拠したAPIでは、クライアントはAPIの構造について何も知る必要がありません。むしろサーバーは、クライアントがサービスを利用するために必要な情報を提供する必要があります。HTMLフォームがその例です。サーバーは、リソースの場所と必須フィールドを指定します。ブラウザはどこに情報を送ればいいのか、どのような情報を送ればいいのかを事前に知ることはできません。どちらの形式の情報も、すべてサーバーから提供されるのです。 (この原理をHATEOAS: Hypermedia As The Engine Of Application Stateといいます。)

では、これが HTTP にどのように適用されるのか、また、実際にどのように実装されるのか HTTP は、動詞とリソースを中心に構成されています。主に使われている動詞は「GET」と「POST」の2つで、これは誰もが知っていると思います。しかし、HTTP標準規格では、「PUT」や「DELETE」などの動詞も定義されています。これらの動詞は、サーバーからの指示に従って、リソースに適用されます。

例えば、Webサービスで管理されているユーザデータベースがあるとします。このサービスでは、JSONをベースにしたカスタムハイパーメディアを使用しています。このハイパーメディアには、mimetype application/json+userdbを割り当てています(他にも、application/xml+userdbapplication/whatever+userdbなど、多くのメディアタイプがサポートされている可能性があります)。クライアントとサーバーは、このフォーマットを理解するようにプログラムされていますが、お互いのことは何も知りません。Roy Fielding]1が指摘するように。

REST APIは、その記述上の努力のほとんどすべてを以下に費やすべきである。 REST APIは、リソースの表現やアプリケーションの状態の駆動に使用されるメディアタイプの定義や REST APIは、リソースの表現やアプリケーションの状態を動かすために使用されるメディ アタイプの定義や、拡張関係名の定義、および/または、アプリケーションの状態を動かすために使用されるハ イパーテキスト対応マークアップの定義に、記述の労力のほとんどを費やすべきである。 既存の標準的なメディアタイプに対して、拡張関係名や

ベースリソース / へのリクエストは、以下のようなものを返すかもしれません。

Request (リクエスト)

GET /
Accept: application/json+userdb

Response

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"
        }
    ]
}

このレスポンスから多くのことがわかります。例えば、/userPOSTすることで、新しいユーザーを作成できることがわかります。

**リクエスト

POST /user
Accept: application/json+userdb
Content-Type: application/json+userdb

{
    "name": "Karl",
    "country": "Austria"
}

Response

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"
}

Response

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動詞(GETPUTPOSTDELETEなど)を使用していること、そして、クライアント側で想定している唯一の知識がメディア定義であることに注目してください。

詳しくはこちらをご覧ください。

(この回答は、ポイントがずれているという批判をかなり受けています。ほとんどの場合、それは正しい批判でした。私が最初に説明したことは、RESTの本当の意味よりも、私が最初にこれを書いた数年前にRESTが通常どのように実装されていたかに沿ったものでした。本当の意味をよりよく表すために答えを修正しました)

解説 (39)

RESTとは、様々なHTTPメソッド(主にGET/PUT/DELETE)を使ってデータを操作することです。

メソッドを削除するために特定のURLを使用するのではなく(例えば、/user/123/delete)、/user/[id]のURLにDELETEリクエストを送信し、ユーザーを編集し、ユーザーの情報を取得するには、/user/[id]にGETリクエストを送信することになります。

例えば、以下のようなURLのセットがあったとします。

GET /delete_user.x?id=123
GET /user/delete
GET /new_user.x
GET /user/new
GET /user?id=1
GET /user/id/1

HTTPの "動詞 "を使って...

GET /user/2
DELETE /user/2
PUT /user
解説 (5)

ロイ・フィールディングが論文1で示したRESTスタイルにシステムのアーキテクチャが適合するプログラミングのことです。これは、ウェブを(多かれ少なかれ)説明するアーキテクチャ・スタイルなので、多くの人が興味を持っています。

ボーナスの答えです。学術的にソフトウェア・アーキテクチャーを研究していたり、ウェブサービスを設計していたりしない限り、この言葉を聞いたことがある人はいないと思います。

解説 (4)