81

私が関与している SaaS スタートアップでは、RESTful Web API と、それを使用するさまざまなプラットフォームでのいくつかのクライアント アプリの両方を構築しています。API は理解できたと思いますが、今はクライアントに目を向けています。REST について読んでいると、REST の重要な部分は Discovery であることがわかりますが、Discovery が実際に何を意味するのかについて、2 つの異なる解釈の間で多くの議論があるようです。

  1. 開発者の発見: 開発者は、リソース URI、クエリ パラメーター、サポートされている HTTP メソッド、およびドキュメントを参照して API の応答を実験することで発見したその他の詳細など、大量の API の詳細をクライアントにハードコードします。このタイプの発見には、クールなリンケージと API のバージョン管理の問題が必要であり、クライアント コードと API のハード カップリングにつながります。十分に文書化された RPC のコレクションを使用する場合よりもはるかに優れているようには見えません。

  2. ランタイム検出- クライアント アプリ自体は、アウト オブ バンド情報をほとんどまたはまったく使用せずに、必要なものをすべて把握できます (おそらく、API が扱うメディア タイプの知識のみ)。リンクはホットになる可能性があります。しかし、API を非常に効率的にするには、クエリ パラメータのリンク テンプレートを大量に作成する必要があるようです。これにより、帯域外の情報が忍び寄ります。開発でここまで来ました。しかし、私は疎結合のアイデアが好きです。

ランタイム検出は REST の聖杯のようですが、そのようなクライアントを実装する方法についての貴重な議論がほとんど見られません。私が見つけたほぼすべての REST ソースは、開発者の発見を想定しているようです。ランタイム検出リソースを知っている人はいますか? ベストプラクティス?実際のコードを含む例またはライブラリ? 私は 1 つのクライアントの PHP (Zend Framework) で作業しています。もう一方は Objective-C (iOS) です。

開発者コミュニティの現在の一連のツールと知識を考えると、ランタイムの発見は現実的な目標ですか? すべての URI を不透明な方法で処理するようにクライアントを作成することはできますが、これを最も効率的に行う方法は、特に低帯域幅の接続では問題です。とにかく、URI は方程式の一部にすぎません。ランタイム コンテキストでのリンク テンプレートはどうですか? 多くの OPTIONS リクエストを行う以外に、どのメソッドがサポートされているかを伝えるのはどうですか?

4

6 に答える 6

19

これは間違いなく難しい問題です。Google では、すべての新しい API が構築される Discovery Service を実装しました。TL;DR バージョンは、クライアントが解析できる JSON スキーマのような仕様を生成するもので、その多くは動的です。

その結果、開発者にとっては SDK のアップグレードがより簡単になり、私たちにとっては保守がより簡単/より良いものになることを意味します。

決して完璧な解決策ではありませんが、開発者の多くは気に入っているようです。

詳細については、リンクを参照してください (必ずビデオをご覧ください)。

于 2012-02-09T02:19:36.530 に答える
12

魅力的な。あなたが説明しているのは、基本的にHATEOASの原則です。あなたが尋ねるHATEOASとは何ですか?これを読んでください: http://en.wikipedia.org/wiki/HATEOAS

簡単に言えば、HATEOAS はリンクをたどるという意味です。このアプローチは、クライアントを特定の URL から切り離し、誰にも影響を与えることなく API を柔軟に変更できるようにします。

于 2012-02-09T06:01:36.007 に答える
6

宿題を終えて、その核心にたどり着きました。ランタイムの発見は至高の目標です。それを追いかけないでください。

UDDI は、ランタイムの発見に関する痛烈な話をしています: http://en.wikipedia.org/wiki/Universal_Description_Discovery_and_Integration

于 2012-02-09T01:52:03.923 に答える
1

HATEOASの重要なポイントは、それがクライアント側の聖杯であるということではなく、クライアントをURIの変更から分離することだと思います。これは、システムがオブジェクトのどのリンクが編集可能なフォームであるかを知っています。重要な点は、ハイパーメディア対応のemdiaタイプ(HTML、XHTMLなど)を使用することです。

于 2012-12-11T15:32:46.873 に答える
0

あなたが書く:

API を非常に効率的にするには、クエリ パラメーターのリンク テンプレートを大量に作成する必要があるようです。これにより、帯域外の情報が忍び寄ります。

そのリンク テンプレートが前の要求で提供されている場合、アウト オブ バンド情報はありません。たとえば、HTML 検索フォームはリンク テンプレート ( /search?q=%@) を使用して URL ( ) を生成します/search?q=hateoasが、HTML フォームと の使用方法以外はクライアント (Web ブラウザ) には何もわかりませんGET

于 2013-08-06T15:03:26.350 に答える