1

REST API がハイパーテキスト駆動型であるだけでなく、機械で読み取り可能である方法について、私は混乱しています。私が API を設計し、いくつかのエンドポイントがコレクションのコンテンツをリストするとします。

GET /api/companies/

サーバーは、会社のリソースを含むリストを返す必要があります。例:

/api/companies/adobe
/api/companies/microsoft
/api/companies/apple

<a>1 つの方法は、それぞれのリソースへのリンクを含むハイパーテキスト (html) ページを生成することです。ただし、ブラウザ以外のクライアントがこのリストを簡単に読めるようにしたいとも考えています。たとえば、一部のクライアントは、ドロップダウン GUI に企業を入力したい場合があります。この場合、html ドキュメントを返すことは不適切であり、リストを JSON または XML 形式で返す方がよい場合があります。

REST スタイルがどのように両方を満たすことができるかは、私には明らかではありません。ブラウザとブラウザ以外のクライアントの両方に適した REST API の実用的なソリューションまたは例はありますか?

4

3 に答える 3

3

あなたが探しているものは、最近では HATEOAS API と呼ばれています。例については、この質問を参照してください: HATEOAS (REST アーキテクチャ) の実際の例

Roy Fielding によって最初に定義された ReST アーキテクチャ スタイルは、アーキテクチャの制約の 1 つとして「アプリケーション状態のエンジンとしてのハイパーテキスト」を規定しています。しかし、人々が「RESTful API」を「HTTP 動詞を正しく使用する」ことと比較し始めたとき、この概念は多かれ少なかれ「翻訳で失われました」(運が良ければもう少し)。(編集: 私の主張に信憑性を与えることは、 RESTful プログラミングとは正確には何ですか?の 1 番目と 2 番目に高い回答です。最初の話は HTTP 動詞についてのみです)。

あなたの質問に対するいくつかの考え: (主に、主題が私を魅了し続けているため)

HATEOAS では、正確な意味を持つ標準化されたメディア タイプが非常に重要です。これに関する一般的な理解とツールの恩恵を受けるために、可能な場合は既存のメディア タイプを再利用することが最善であると一般的に考えられています。一般的な方法の 1 つは XML を使用することです。これは、XML スキーマまたは名前空間を使用して、データの一般的な構造とセマンティクスを定義する方法の両方を提供するためです。HATEOAS を考えると、XML 自体は多かれ少なかれ無意味です。同じことが JSON にも当てはまります。

リンクをサポートするには、リンクを「ネイティブに」サポートするメディア タイプ (つまりtext/htmlapplication/xhtml+xmlたとえばXLINK。application/jsonJSON 自体にはメタデータを定義する事前定義された場所がないため、使用できないと思います。jsonに基づいてメディアタイプを設計することは可能だと思います-それを呼び出しますapplication/x-descriptive-json- 返される JSON ドキュメントが「header」および「body」プロパティで構成されている必要があることを前もって定義し、ヘッダーにはさらに指定されたメタデータを含めることができます。埋め込みリンクをサポートするためだけに、JSON のメディア タイプを設計することもできます。単純なメディア タイプで、拡張性が低い。私が説明した両方のものが何らかの形ですでに存在していても、私は驚かないでしょう.

ブラウザとブラウザ以外のクライアントの両方に親切にするために必要なのは、Acceptヘッダーを尊重することだけです。text/html を要求するクライアントは、text/html に本当に満足していると想定する必要があります。text/htmlこれは、ブラウザ以外の API エントリ ポイントのメディア タイプとして使用しないための引数になる可能性があります。原則として、リンクだけが必要な場合でも機能すると思います。優れた HTML マークアップは、ブラウザ以外のクライアントでも十分に利用できます。HTML は、 を通じてrel="next"、ページングを行う方法も定義しますrel="previous"

ブラウザーとブラウザー以外の両方で単一のメディア タイプが持つ 3 つの最大の問題は次のとおりです。

  1. すべてのサイト html がブラウザー以外での消費を考慮して出力されるようにする必要があります。つまり、十分なメタデータを埋め込む必要があります。おそらくいくつかの場所に隠しリンクを追加します。視覚障害者のアクセシビリティについて考えるのと少し似ていますが、今は、英語や自然言語を読めない消費者向けに設計しています。:)
  2. ブラウザ以外のクライアントには本質的に関係のない多くのマークアップとコンテンツが存在する可能性があります。ヘッダーとフッターのテキストを繰り返すことを考えてみてください。ナビゲーション エリアはそのようなものです。
  3. HTML には、必要な表現力が欠けているだけかもしれません。原則として、あなたのサイトに固有のいくつかの規則を「考え出す」とすぐに(つまりrel="original-image、フルサイズの元の画像へのリンクを意味します)、厳密にHATEOSを行うことはもうありません(少なくとも、それは私の理解です) )。HTML には、要素に新しい意味を定義する余地がありません。XML はそうです。

XHTML は XML であるため、名前空間を介して新しい種類の要素を指定できるため、問題 3 の回避策は XHTML を使用することです。

@robert_b_clarke が Microformats に言及しているのを見ました。これは、この議論に関連しています。これは実際、人間以外のエージェントのアクセシビリティを改善しようとする 1 つの方法です。技術的な観点から見たこれに関する主な問題は、基本的に「帯域外」の情報に依存していることです。マイクロフォーマットはtext/html仕様の一部ではありません。ある意味では、「タイプ A で ID X のリソースがあるとしたら、mysite.com/A/X でアクセスできます」と言うことに匹敵します。私が挙げた例はrel=original-image、マイクロフォーマットとも言えます。しかし、それは道のりです。「API ドキュメントに記載してください: 私たちは適切にフォーマットされた text/html を提供しています。私たちの text/html には、次のマイクロフォーマットも埋め込まれています: ...」 独自のものを定義することもできます。

次のプレゼンテーションは、HATEOAS の優れた現実的な説明だと思います

編集:

HTML5の microdataについて読んだだけです (@robert_b_clarke のおかげで)。HTML5 は、標準の HTML タグで可能な以上の追加情報を提供する方法を提供しているようです。私が書いた日付を考えてみましょう。:) 編集 編集: これは下書きにすぎません。;)

編集 2

「記述的 JSON」形式について: これは発表されたばかりですhttp://jsonapi.org/。彼らは独自の MIME タイプを申請しました。これは Yehuda Katz (Ember.js) と、 Designing Hypermedia APIを書いている Steve Klabnibによるものです。

于 2013-05-02T10:59:55.487 に答える
1

クライアントはHTTPAcceptヘッダーを使用して、特定のコンテンツ タイプで応答を要求できます。たとえば、REST API クライアントは、次のヘッダーを使用して JSON データを要求する場合があります。

GET http://yourdomain.com/api/companies
Accept: application/json

したがって、サーバー アプリは Accept ヘッダーの値に応じて、同じ URL に対して JSON または HTML を提供できます。もちろん、すべての REST クライアント アプリにはそのヘッダーを含める必要がありますが、これは実用的である場合とそうでない場合があります。

代替アプローチは多数ありますが、その 1 つは、同じ XHTML コンテンツをブラウザーとクライアント アプリの両方に提供することです。HTML5 microdataまたはMicroformatsを使用して、HTML 内に構造化データを埋め込むことができます。このアプローチには多くの制限があります。API クライアント リクエストは、Web ブラウザでしか使用できないものが大量に含まれるため、必要以上に大きく複雑なレスポンスになります。強制したい動作の違いは他にもあります。たとえば、保護されたリソースに対する許可されていない GET 要求に対して、マシン クライアントに対して HTTP 401 応答を返し、Web ブラウザーに対してログイン ページにリダイレクトすることが必要になるでしょう。

最も簡単な方法は、あまり原則にとらわれず、人にやさしいバージョンと機械にやさしいバージョンのリソースを別々の URL で提供することです。

http://yourdomain.com/companies
http://yourdomain.com/api/companies
于 2013-05-02T09:39:23.193 に答える
0

この質問がいくつかの方法で回答されているのを見てきました。一部の開発者は、/api/companies/?rtnType=json のように、応答の形式を示す要求パラメーターを追加します。この方法は、小規模なアプリケーションでは許容される場合があります。ただし、これは真の RESTful 神学からの逸脱です。

より良い方法 (少なくとも Java では) は、Spring Framework のようなものを使用することです。Spring は、HTTP リクエストのメディア タイプに基づいて動的なレスポンス フォーマットを提供できます。書籍「Spring in Action」(Walls、2011 年) の第 11 章に、これに関する優れた説明があります。また、REST を壊すことなく他の言語で動的応答フォーマットを実現する同様の方法があります。

于 2013-05-02T02:01:12.333 に答える