web-dev-qa-db-ja.com

ReST APIのすべてのエンドポイントを検出する方法はありますか?

特定のAPIのすべてのエンドポイントをプログラムで検出できるかどうか疑問に思っています。

たとえば、ブラウザまたはcurlでこのURLを取得した場合: https://api.Twitter.com/1.1/

JSON応答として次のようなメッセージが表示される場合があります。

{"TwitterAPI":{
    "version" : 1.1,
    "GET" : {
        "search/" : ["users", "trending"],
        "users/" : ["id", "handle"]
    }
}

もちろん、Twitterはこの形式を公開するかどうかを選択できます。副次的な質問として、コントローラーで作成したAPIルートを自動的にマッピングして公開するJavaまたはJavascriptのライブラリはありますか?

30
4m1r

標準のレジストリサービスがないため、RESTサービスをプログラムで検出する方法はありません。

異常なブルートフォース検索を行う以外に、正しいURLを見つける方法はありません(正しいパラメーターは言うまでもありません)。したがって、唯一のオプションはAPIを文書化することです。そのために私が今まで見た中で最良の選択は次のとおりです。

29
Gergely Bacso

一部のRESTful APIは、Webアプリケーション記述言語リソースを公開しています(WADL-アヒルが行う散歩のように発音します-略して)。 JAX-RS、または少なくともJersy webappsは、デフォルトでアプリケーションルートURL /application.wadlでこれを行います。 TwitterのAPIはこれらの1つではないようです。多くのREST純粋主義者は、APIと対話し、他のエンドポイントが提供するものを確認するだけで、APIが自己記述的で自己発見可能であるべきだと主張するでしょう。

ウィキペディアのWADLの詳細...

10
David

REST APIについて知っておく必要があるすべてのものを、最初のエントリポイントのみを知ることで発見できるはずです。これは、RESTの基本的なポイントの1つです。リソースの発見は、サーバーからの応答に含まれるハイパーメディアリンクにまで及びます。

2008 Roy Fieldingは、HTTPベースのAPIを作成してRESTを呼び出す人々について悩み始めました それがホットな新しいものだったからです。ここに彼がするいくつかのポイントがあります。

A REST API固定リソース名または階層を定義してはいけません(クライアントとサーバーの明らかな結合)。サーバーは代わりに、サーバーがクライアントに、メディアタイプとリンク関係内でそれらの命令を定義することにより、HTMLフォームやURIテンプレートで行われるような適切なURIの構築方法を指示できるようにします。クライアントは、RPCの機能的結合と同等のデータ指向のドメイン固有の標準など、帯域外情報に起因するリソース構造を想定しています。

そして

A REST APIは、最初のURI(ブックマーク)および対象とする聴衆に適した標準化されたメディアタイプのセットを超える事前知識なしで入力する必要があります(つまり、APIを使用する可能性のあるすべてのクライアントが理解することが期待されます。その時点から、すべてのアプリケーションの状態遷移は、受信に存在するサーバー提供の選択肢のクライアント選択によって駆動される必要があります表現は、それらの表現のユーザーの操作によって暗示されます。遷移は、クライアントのメディアタイプとリソース通信メカニズムの知識によって決定(または制限)される場合がありますが、どちらもオンザフライ(たとえば、コードオン[ここでの失敗は、帯域外情報がハイパーテキストの代わりに相互作用を促進していることを意味します。]

これが実際に意味することは、エントリポイント(通常は「/」のルートURIを使用)に他のREST APIへのリンクが含まれます。これらのAPIには他のAPIへのリンクが含まれます。リンクを持たないAPIであってはなりません。

ここでの他の回答は、RESTの最も基本的な原則を認めないという点で根本的に間違っています。

2
Qwerky