2012-09-11 5 views
5

LIKE条件付きのREST APIを設計するにはどうすればよいですか?私は、RESTのAPIを設計し、「人」のための実体を持ってい

GET http://localhost/api/people 

は、システム内のすべての人々

GET http://localhost/api/people/1 

のリストは、ID 1

で人を返します
GET http://localhost/api/people?forename=john&surname=smith 

姓と名が一致するすべての人物を返しますが、私はさらに要件があります。たとえば、forenameが "jo"で始まるすべての人物をAPIコンシューマが取得できるようにする、最もクリーンでベストプラクティスな方法は何ですか。

私はいくつかのAPIはこのような操作を行う見てきました:

チルダは「ファジー」マッチを意味
GET http://localhost/api/people?forename=jo~&surname=smith 

。一方、私はそれが完全に異なる基準で実装されていることを見てきました。 -soundslike(SOUNDEXの試合のいくつかの並べ替えのために)、-contains、私は-endswithている可能性があります考慮ビット面倒なようだ

GET http://localhost/api/people?forename-startswith=jo&surname=smith 

誰も、同じような機能を持つうまく設計されたREST APIの優れた例を示してくれますか?

答えて

1

AFAIK、上記のどれもかなりRESTfulです。どちらも、問合せを呼び出す方法(最初の問合せパターンでは2番目の問合せパターンでは問合せDSL)でクライアントの部分に関する予備知識に依存しています。 2番目の例では、実際には、APIはデータストアのラッパーだけに縮小されています。そのため、APIはサーバードメインを定義しません。これはデータプロバイダーです。これは、RESTのクライアントサーバーの制約とは対照的です。

さまざまなクエリ機能を備えた本格的なデータストアを公開する必要がある場合は、ODataの既知の標準に従うことをお勧めします。 ODataはRESTとして販売されていますが、多くのRESTヘッドには問題があります。とにかく、一日の終わりにはそれが機能し、RESTの議論は一般に分析麻痺につながります。

私がこれをやっていたのであれば、APIを一般的なユースケースに制限することになるでしょう。したがって、DSLを定義することなく2番目のものと同じようになります(forename-startswithではなくforenameStartsWith)。

しかし、多くのフィールドとさまざまな条件に基づいてクエリを行う必要がある場合は、ODataを使用します。

0

両方の例では、フィルタリングにクエリパラメータが使用されています。これらのクエリパラメータが呼び出されるかどうか、またはいくつかのワイルドカード構文が使用されるかどうかは重要ではないと思います。

どちらのアプローチも等しくRESTFulです。

3

IMHOファジーマッチや-endswith -containsなどがある場合は問題ありません。REST APIでこのようなパラメータを簡単に解析できるようにして、データソースからデータを取得する関数を定義できます(DBまたはXMLファイルなど)

私の経験からPHPを使用している場合、SlimFrameworkは、軽量で使いやすいソリューションです。

3

私はあなたにOData protocolをお勧めしますQuery String Optionsを提供します。あなたがしたことは大丈夫で、RESTの慣行に従います。

しかし、ODataプロトコルには$expandパラメータ、さらに$filterパラメータが記述されています。この$プレフィックスは、「システムクエリオプション」を意味し、それはあなたが次のURIを記述することができますので、あなたは、最後の1に興味を持つようになります。それはあなたがデータのようなSQLを渡すことができます

http://services.odata.org/Northwind/Northwind.svc/Customers?$filter=tolower(CompanyName) eq 'foobar' &select=FirstName,LastName&$orderby=Name desc 

、それは素敵な代替することができますあなたが記述したものに(両方の解決策は問題ありません、ただの味の問題です)。

関連する問題