リソースの作成を検討しSpecialToken
、API の消費者がPOST
新しいインスタンスを取得できるようにする必要があると思います。User
どういうわけか、リソースをリソースにリンクしたいと思うでしょうSpecialToken
。REST の中心的な原則の 1 つは、帯域外の情報に依存してはならないということです。そのため、それを忠実に守りたい場合は、リンクを使用する可能性を調査する必要があります。
まず、あなたが持っているものを見てみましょう:
リクエスト:
GET /User/1
Accept: application/json
応答:
200 OK
Content-Type: application/json
{
"Id": 1,
"Email": "myemail@gmail.com",
"SpecialToken": "12345689"
}
SpecialToken
この応答にはオブジェクトにプロパティが含まれていますが、この特定のオブジェクト構造を理解するようにプログラムされていないクライアントにとっては、実際には何も意味しないためですContent-Type
。application/json
JSON を理解するだけのクライアントは、これを他のオブジェクトと同様にオブジェクトとして受け取ります。今はそれを無視しましょう。SpecialToken
フィールドに別のリソースを使用するというアイデアを採用したとしましょう。次のようになります。
リクエスト:
GET /User/1/SpecialToken
Accept: application/json
応答:
200 OK
Content-Type: application/json
{
"SpecialToken": "12345689"
}
を実行したためGET
、理想的には、この呼び出しを行ってもリソースは変更されません。ただし、POST
メソッドは同じセマンティクスに従っていません。実際、POST
このリソースにメッセージを発行すると、別の本文が返される可能性があります。そこで、次のことを考えてみましょう。
リクエスト:
POST /User/1/SpecialToken
Accept: application/json
応答:
200 OK
Content-Type: application/json
{
"SpecialToken": "98654321"
}
POST
メッセージに本文が含まれていないことに注意してください。これは型にはまらないように思えるかもしれませんが、HTTP 仕様はこれを禁止しておらず、実際、W3C TAG はそれで問題ないと言っています。
HTTP メッセージ本文でデータを提供しなくても POST を使用できることに注意してください。この場合、リソースは URI アドレス指定可能ですが、POST メソッドはクライアントに対して、相互作用が安全でないか副作用がある可能性があることを示します。
私にはほぼ正しいように聞こえます。POST
以前、一部のサーバーで本文のないメッセージに問題があると聞いたことがありますが、個人的には問題はありませんでした。ヘッダーが適切に設定されていることを確認してContent-Length
ください。
それを念頭に置いて、これはあなたが提案していることを行うための完全に有効な方法のようです(RESTによると)。しかし、JSON が実際にはアプリケーション レベルのセマンティクスを持たないことについて少し触れたときのことを覚えていますか? つまり、クライアントが実際に を送信して最初POST
に新しい を取得するSpecialToken
には、そのリソースの URL、または少なくともそのような URL を作成する方法を知る必要があります。これは、クライアントをサーバーに結びつけるため、悪い習慣と見なされます。説明しましょう。
次のリクエストがあるとします。
POST /User/1/SpecialToken
Accept: application/json
サーバーが URL を認識しなくなった場合、/User/1/SpecialToken
404 またはその他の適切なエラー メッセージが返され、クライアントが壊れている可能性があります。これを修正するには、担当するコードを変更する必要があります。これは、クライアントとサーバーが互いに独立して進化することができず、結合を導入したことを意味します。ただし、クライアントの HTTP ルーチンでヘッダーを検査できる場合、これを修正するのは比較的簡単です。その場合、メッセージへのリンクを導入できます。最初のリソースに戻りましょう。
リクエスト:
GET /User/1
Accept: application/json
応答:
200 OK
Content-Type: application/json
Link: </User/1/SpecialToken>; rel=token
{
"Id": 1,
"Email": "myemail@gmail.com",
"SpecialToken": "12345689"
}
応答には、ヘッダーで指定されたリンクがあります。この小さな追加により、クライアントはリソースへのアクセス方法を知る必要がなくなりSpecialToken
、リンクをたどるだけで済みます。これはすべてのカップリングの問題を処理するわけではありませんが (たとえば、登録されたリンク関係token
ではありません)、大いに役立ちます。サーバーはURL を自由に変更できるようになり、クライアントは変更しなくても動作します。SpecialToken
これは HATEOAS (Hypermedia As The Engine Of Application State の略) の小さな例です。これは基本的に、アプリケーションが物事を前もって知るのではなく、やり方を発見することを意味します。頭字語部門の誰かがこれで解雇されました。このトピックに関する食欲をそそるために、ハイパーメディアを多用する API を示すJon Moore による非常にクールな講演があります。ハイパーメディアのもう 1 つの優れた入門書は、Steve Klabnik の著書です。これで始められるはずです。
お役に立てれば!