100

私がRESTについて知っていると思ったことの多くは明らかに間違っています-そして私は一人ではありません。この質問には長いリードインがありますが、情報が少し散らばっているので必要なようです。このトピックに既に精通している場合、実際の質問は最後になります。

RoyFieldingのRESTAPIの最初の段落から、ハイパーテキスト駆動型である必要があります。彼の仕事が広く誤解されていると彼が信じていることは明らかです。

HTTPベースのインターフェースをRESTAPIと呼ぶ人の数に不満を感じています。今日の例はSocialSiteRESTAPIです。それがRPCです。RPCを叫びます。ディスプレイには非常に多くのカップリングがあるため、Xレーティングを付ける必要があります。

フィールディングは、RESTAPIのいくつかの属性をリストします。それらのいくつかは、SOや他のフォーラムでの一般的な慣行と一般的なアドバイスの両方に反しているようです。例えば:

  • REST APIは、最初のURI(ブックマーク)と対象読者に適した標準化されたメディアタイプのセット(つまり、APIを使用する可能性のあるすべてのクライアントによって理解されることが期待される)以外の事前知識なしで入力する必要があります。..。

  • REST APIは、固定リソース名または階層(クライアントとサーバーの明らかな結合)を定義してはなりません。..。

  • REST APIは、リソースの表現やアプリケーションの状態の駆動に使用されるメディアタイプの定義、または既存の標準メディアタイプの拡張リレーション名やハイパーテキスト対応のマークアップの定義に、ほとんどすべての記述的努力を費やす必要があります。..。

「ハイパーテキスト」の概念が中心的な役割を果たします。URI構造やHTTP動詞の意味よりもはるかに重要です。「ハイパーテキスト」は、コメントの1つで定義されています。

私が[フィールディング]ハイパーテキストと言うとき、私は情報とコントロールの同時提示を意味し、情報がユーザー(またはオートマトン)が選択肢を取得してアクションを選択するためのアフォーダンスになるようにします。ハイパーメディアは、メディアストリーム内に一時的なアンカーを含めるためのテキストの意味を拡張したものです。ほとんどの研究者はその区別をやめました。

ブラウザでは、ハイパーテキストはHTMLである必要はありません。マシンは、データ形式と関係タイプを理解すると、リンクをたどることができます。

この時点で推測していますが、上記の最初の2つのポイントは、次のようなFooリソースのAPIドキュメントがクライアントとサーバー間の緊密な結合につながり、RESTfulシステムには存在しないことを示唆しているようです。

GET   /foos/{id}  # read a Foo
POST  /foos/{id}  # create a Foo
PUT   /foos/{id}  # update a Foo

代わりに、エージェントは、たとえば/ foosに対してGETリクエストを発行することにより、すべてのFoosのURIを検出するように強制する必要があります。(これらのURIは上記のパターンに従うことが判明する場合がありますが、それは重要ではありません。)応答は、各アイテムへのアクセス方法とそのアイテムで何ができるかを伝えることができるメディアタイプを使用し、上記の3番目のポイントを生じさせます。 。このため、APIドキュメントでは、応答に含まれるハイパーテキストを解釈する方法の説明に焦点を当てる必要があります。

さらに、FooリソースへのURIが要求されるたびに、応答には、エージェントがURIを介して関連リソースや親リソースにアクセスしたり、作成後にアクションを実行したりする方法を見つけるために必要なすべての情報が含まれます。 /リソースの削除。

システム全体の鍵は、応答がメディアタイプに含まれるハイパーテキストで構成され、それ自体が続行するためのエージェントオプションに伝達されることです。それは、ブラウザが人間のために機能する方法と同じです。

しかし、これはこの特定の瞬間における私の最善の推測です。

フィールディングはフォローアップを投稿し、彼の議論は抽象的すぎ、例が不足しており、専門用語が豊富であるという批判に応えました。

他の人は、私が書いたものを、より直接的であるか、今日のいくつかの実際的な懸念に適用できる方法で解読しようとします。次のトピックに取り組んだり、会議の準備をしたり、別の基準を書いたり、遠くの場所に旅行したり、給料をもらったと感じさせる小さなことをしたりするのに忙しいので、私はおそらくそうしません。

それで、実用的な考え方を持つREST専門家への2つの簡単な質問:フィールディングが言っていることをどのように解釈し、REST APIを文書化/実装するときにそれをどのように実践しますか?

編集:この質問は、あなたが話していることの名前がない場合、何かを学ぶことがどれほど難しいかの一例です。この場合の名前は「アプリケーション状態のエンジンとしてのハイパーメディア」(HATEOAS)です。

4

9 に答える 9

22

あなたの説明はほとんどそれをカバーしていると思います。URI は不透明な識別子であり、ほとんどの場合、ユーザー エージェントがアプリにアクセスするために使用するブックマーク URI を超えて伝達されるべきではありません。

文書化に関しては、この質問はかなりの回数行われています。メディア タイプを、それに含まれるハイパーリンク コントロール (リンクとフォーム)、および必要に応じて相互作用モデルと共に文書化します (AtomPub を参照)。

URI やその作成方法を文書化する場合、それは間違っています。

于 2009-07-22T12:57:30.060 に答える
8

あなたの解釈は私には正しいようです。フィールディングの制約は実際に適用できると思います。

REST インターフェースを文書化する方法の良い例を誰かが公開してくれることを本当に望んでいます。非常に多くの貧弱な例があります。ユーザーを指す有効なものがいくつかあると、非常に価値があります。

于 2009-07-22T17:11:53.917 に答える
5

私は HATEOAS に従って書かれた API の良い例を探していましたが、見つけるのに苦労しました (SunCloud API と AtomPub の両方を「通常の」API の状況に適用するのは難しいことがわかりました)。そこで私は、REST の適切な実装とは何かについての Roy Fielding のアドバイスに従って、私のブログで現実的な例を作成しようとしました。原則としてかなり単純であるという事実にもかかわらず、例を思いつくのは非常に難しいことがわかりました(WebページではなくAPIを操作するときに混乱するだけです)。私は Roy が問題にしていたことを理解し、同意します。これは、API を適切に実装するための考え方の変化にすぎません。

ご覧ください: Rest を使用した API の例

于 2012-05-16T18:58:36.847 に答える
4

興味のある方のために、 Sun Cloud APIで実際の HATEOAS の詳細な例を見つけました。

于 2009-07-26T19:31:44.707 に答える
4

REST が世に出てから数年が経ち、技術者はリソースの概念と、何が実際に RESTful であるか、またはそうでないかについて理解してきたと思います。

リチャードソン成熟度モデルによると、API がどの程度 RESTful であるかを定義する 4 つのレベル (0 から 3) があり、Roy Fielding が意図したように、3 は真の RESTful API であることを意味します。

レベル 0 は、SOAP のように、エントリ ポイント URI が 1 つしかない場合です。

レベル 1 は、API がさまざまなリソースを区別できることを意味し、複数のエントリ ポイントがありますが、まだ SOAP の匂いがします。

レベル 2 は、主に GET、POST、DELETE などの HTTP 動詞を使用する場合です。これは、REST が実際に登場するレベルです。

レベル 3 では、ハイパーメディア コントロールの使用を開始して、API をのRESTful にします。

さらに読むための推奨リンク:

于 2016-06-01T10:58:26.483 に答える
4

ほとんどの人が誤解しているのは、(少なくとも私が思うに) REST の世界では、サーバーやサービスとは関係なく、"Rest インターフェース" を文書化せず、文書化するのはメディア タイプであるということです。

于 2010-06-12T10:15:55.817 に答える
1

絶対に正しい。さらに、パターンがサーバーから受信したドキュメントからのものである限り、RESTfulアプリケーション内でURIテンプレートは完全に問題ないことに注意してください(OpenSearchが適切な例です)。URIテンプレートの場合、それらが使用されている場所と、テンプレートで予想されるプレースホルダーが何であるかを文書化しますが、テンプレート自体は文書化しません。Wahnfriedenが言ったこととは少し反対ですが、これも例外ではありません。

たとえば、私の仕事では、内部ドメイン管理システムがあり、サービスドキュメントは2つのURIテンプレートを指定しています。1つはドメインリソースの最適な推測URIを生成するためのもので、もう1つはドメインの可用性を照会するためのURIを構築するためのものです。ドメインコレクションをページングして、特定のドメインのURIが何であるかを把握することは可能ですが、管理するドメインの数が膨大であることを考えると、これはクライアントにとって実行可能ではないため、クライアントに何を推測する方法を提供します。ドメインリソースのURIは、クライアントの観点からの実装の容易さ、およびサーバーの観点からの帯域幅の点で大きなメリットになる可能性があります。

あなたの質問について:私たちの規範的なドキュメントは、公開されたリソース、それらのリソースに対するさまざまなメソッドの影響、使用される表現メディアタイプとそのスキーマ、およびそれらの表現のURIが指すリソースの種類です。

また、ドキュメントに記載されているURIを読みすぎないように免責事項を添付した、非規範的な(有益な)ドキュメントも含まれています。これは、典型的なクライアント/サーバーの相互作用の例を示しています。これにより、かなり抽象的な規範的なドキュメントが具体的に表現されます。

于 2009-07-22T14:45:30.853 に答える
0

GET /foos/createFormを作成するときに指定する必要のあるフォームフィールド値を取得するために呼び出されると仮定しますPOST /foosGET /foos/createFormここで、この特定のURL、つまりfooの作成に使用される1は、Fieldingの提案に従って、送信アクションリンクとしての応答内で言及する必要があります。
次に、アクションをよく知られているHttp動詞からアクションにマッピングすることの利点は何ですか?「コード/構成に関する慣習」は無効になります。

于 2012-06-18T11:10:19.280 に答える