3

私はこのゲームに慣れていないので、物事を誤解している可能性があります。実際、私が物事を誤解していると誰かに言われたら、それはありがたいことです。たぶん、この人は私に正しい道を示すのに十分なほど思いやりがあるでしょう. しかし...

Web サービスに適用される RESTの「ガイドライン」または「ベスト プラクティス」の1 つ( http://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_web_services ) は、呼び出しを行うときに適切なHTTP メソッドを使用する必要があることです(did私はそれを誤解していますか?) REST APIの。

しかし、Web 上の多くの API 実装を見ると、それらに対する呼び出しの 100%が実際にはGET呼び出しであり、それらのURIに応じて、API によって HTTP 動詞またはメソッドの 1 つとして解釈されることがわかります。 .

たとえば、Twitter の REST API ドキュメント ( https://dev.twitter.com/rest/public ) を見ると、原則として 2 つの動詞/メソッド (GET と POST) しか定義されていませんが、実際にはすべての呼び出しが送信されています。 GET として、GET 呼び出しの URI に基づいて、API によって解釈され、処理されます。

例:

GET statuses/lookup : https://api.twitter.com/1.1/statuses/lookup.json

POST statuses/update ( PUT? ): https://api.twitter.com/1.1/statuses/update.json

どちらの場合も、呼び出し自体は GET を使用して行われ、URI の最後の部分はそれを実際の G​​ET または POST として定義しています。

要約すると、真に RESTful であるためには、Web サービス用の REST API のクライアント側実装で適切な HTTP 動詞/メソッドを使用するべきではありませんか?

私は何が欠けていますか?

4

5 に答える 5

11

あなたは多くのことを見逃していますが、心配する必要はありません。ほとんどの人はそうです。

実際には、インターネット上で一般に公開されている、いわゆる REST API のうち、実際に RESTful なものはほとんどありません。これは主に、それらがハイパーテキスト駆動型ではないためです。REST は、SOAP 以外の HTTP API を指すバズワードになりました。したがって、REST API であるという理由だけで API が実際に RESTful であるとは期待しないでください。この回答を読むことをお勧めします。

私の経験からすると、ほとんどの API 開発者は REST が実際に何であるかを認識しておらず、HTTP を使用して URI 内の動詞を回避する HTTP API はすべて REST であると考えています。

REST は一連の制約によって定義されます。その中には統一インターフェースがあります。これは簡単に言えば、基になるプロトコルの予期される動作を変更してはならないことを意味します。REST は特定のプロトコルに結合されていませんが、HTTP で使用されるのが一般的であるため、複雑になることがあります。

HTTP には、GET、POST、PUT、DELETE、PATCH、および HEAD メソッドのセマンティクスが非常に明確に定義されており、POST メソッドのセマンティクスはサーバーによって決定されます。理想的には、REST API は RFC 7231 で決定されているとおりに POST 以外のメソッドに応答する必要がありますが、お気づきのように、自分自身を REST と呼んでいるにもかかわらず、それを行わない API が多数存在します。これは多くの理由で発生します。正しいセマンティクスについて単純な誤解がある場合や、一貫性を維持するため、またはすべてのメソッドをサポートしていない仲介者との下位互換性のため、およびその他の多くの理由で行われている場合があります。

そのため、HTTP メソッドを正しく使用する以外に、真に RESTful にするために行う必要があることは他にもたくさんあります。API がそれさえ正しく理解できない場合は、別の流行語を見つける必要があります。それは明らかに REST ではないからです。

于 2015-03-20T04:28:51.220 に答える
2

あなたは正しいです。「RESTful」になりたい場合、API は各 HTTP メソッドのセマンティクスを尊重する必要があります。

大まかに言えば、REST はメソッド情報(サーバーがをすべきか)、スコープ情報(サーバーがどこでそれを行うべきか) に関するものであり、言及するのをほとんど忘れていましたが、ハイパーメディア主導です (この質問に対する@PedroWerneck のすばらしい回答を確認してください)。それについてもう少し説明し、この問題に関する Fielding のブログ投稿を参照します)。

あなたが言及したAPIが行うことは、URLにメソッドとスコープ情報の両方があることです。それは、RESTful アーキテクチャーにはあまり適していません。

  • 1) HTTP メソッドを適切な方法で使用する (冪等性などのプロパティを尊重する)。
  • 2) 一意の URI を使用して、一意のリソースを識別します。

ポイント 1 は「メソッド情報を伝えるために HTTP メソッドを使用する」と述べ、ポイント 2 は「スコープ情報を伝えるために URI を使用する」と述べています。

繰り返しになりますが、API が URI 内の特定のパラメーターを指定して GET を使用して何かを行う場合 (何かを取得するのではなく)、URI を使用してメソッド情報を伝えています。

さて、心配しないでください。世に出回っているほとんどの API は、RESTful っぽい (Twitter や flickr のように) だけです。つまり、REST と他の何かの間の動物です。それ自体は悪いことではなく、RESTful アーキテクチャ (および HTTP) が提供するメリットを十分に享受できないことを意味します。

RESTful であることは単なるファッションの問題ではなく、ステートレス性、アドレス可能性などの利点があることを忘れないでください。そして、これらは、使用されるはずだったように HTTP 動詞を使用することによってのみ完全に達成できます。


POSTの代わりに を使用することについてはPUT、それらが異なるプロパティ (PUTは冪等でPOSTあるか、そうでない)を持っていることを考えると、を使用することは悪くPOSTありません。それが均一に設計されている限り、つまり、プログラマはPOST、 API: それらはすべて同じように動作する必要があります。(すでに統一されているため、これに悩まされることはありません。) これについては、別の質問 (「まとめ」の部分を参照してください)PUTで、ロイ フィールディングの発言を引用して、もう少し詳しく説明しました。

于 2015-03-19T18:08:49.270 に答える
2

このリンクは、RESTful サービス/Web API の設計に関するヒントを提供できると思います: https://templth.wordpress.com/2014/12/15/designing-a-web-api/

RESTful であると主張するすべての Web サービスが実際に RESTful であるとは限らないことは明らかです ;-)

要するに、RESTful サービスは、その設計目的のために HTTP メソッドを活用する必要があります。

  • method GET: リソースの状態を返す
  • method POST: アクションを実行する (リソース リスト内の要素の作成など)
  • method PUT: リソースの完全な状態を更新する
  • method PATCH: リソースの状態を部分的に更新する
  • method DELETE: リソースを削除する

メソッドは異なるレベルで適用できることにも注意する必要があるため、メソッドは同じことを行いません。

  • リスト リソース (例: path /elements)
  • 要素リソース (例: path /elements/{elementid})
  • 要素リソースのフィールド (例: path elements/{elementid}/fieldname)。これは、複数のカーディナリティを持つフィールド値を管理するのに便利です。フィールドの完全な値 (リスト全体) を送信する必要はありませんが、そこから要素を追加/削除します。

もう 1 つの重要なことは、HTTP ヘッダーを活用することです。たとえば、Acceptコンテンツ ネゴシエーションのヘッダー...

Github の Web API はよく設計されており、そのドキュメントも優れています。閲覧してアイデアを得ることができます。こちらのドキュメントを参照してください: https://developer.github.com/v3/

お役に立てば幸いです、ティエリー

于 2015-03-20T09:36:23.907 に答える
0

REST Richardson 成熟度モデルのトピックを検討してください。

この仕様は、RESTful な特定の API の程度に関するものです。

レベル 0: 説明的な URL への単純な GET および POST 要求

/getUserByName?name=グレッグ

レベル 1: すべてのコンテンツをリソースに分割し、リソース グループでアクションを定義する

/user/getByName?name=グレッグ

レベル 2: HTTP 動詞の適切な使用。

GET /ユーザー/グレッグ

レベル 3: ハイパーメディア コントロールを使用する

異なる API は、REST の異なる成熟度レベルを実装します。そのため、一部の API はすべての HTTP 機能をサポートしていません。

于 2015-10-26T14:46:00.667 に答える