8

私はREST APIを設計しており、「人」のエンティティを持っています:

GET http://localhost/api/people

システム内のすべての人のリストを返します

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

ID 1 の人を返します。

GET http://localhost/api/people?forename=john&surname=smith

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

私はいくつかの API がこれを次のように行うのを見てきました:

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

ここで、チルダは「あいまい」な一致を示します。一方、まったく異なる基準で実装されているのを見てきました。

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

-endswith、-contains、-soundslike (ある種の soundex マッチ用) があるかもしれないことを考えると、これは少し面倒に思えます。

経験から、より適切に機能するものと、同様の機能を持つ適切に設計された REST API の例を提案できますか。

4

4 に答える 4

4

IMHOあいまい一致があるか、-endswith -contains などがあるかどうかは問題ではありません。重要なのは、REST API でそのようなパラメーターを簡単に解析できるかどうかです。これにより、データ ソース (DB または xml ファイルなど) からデータをフェッチする関数を定義できます。 。) によると

PHP を使用している場合...私の経験から言うと、SlimFrameworkは非常に軽量で、簡単に開始できるソリューションです。

于 2012-09-11T13:41:55.597 に答える
3

クエリ文字列オプションを提供するODataプロトコルをお勧めします。あなたがしたことは大丈夫で、RESTの慣習に従います。

ただし、ODataプロトコルは、$expandパラメーター、さらにはパラメーターを記述し$filterます。この$プレフィックスは「システムクエリオプション」を示し、次のURIを記述できるため、最後のプレフィックスに関心があります。

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

これにより、SQLのようなデータを渡すことができます。これは、説明した内容の優れた代替手段になる可能性があります(どちらのソリューションも問題ありませんが、好みの問題です)。

于 2012-09-11T13:43:18.803 に答える
2

私の知る限り、上記のどれも完全に RESTful ではありません。どちらも、クエリを呼び出す方法に関するクライアント側の事前知識に依存しています (最初のケースではクエリ パターン、2 番目のケースではクエリ DSL)。実際、2 番目の例では、API は単なるデータ ストアのラッパーに縮小されています。そのため、API はサーバー ドメインを定義しません。これはデータ プロバイダーです。これは、RESTのクライアント サーバー制約とは対照的です。

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

私がこれを行っていた場合、API を一般的なユースケースに制約する可能性が高いため、クエリ DSL を定義せずに 2 番目のユースケースに似たものにします (したがって、forname-startswith ではなく forenameStartsWith)。

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

于 2012-09-11T15:31:17.613 に答える
0

どちらの例でも、フィルタリングにクエリ パラメータを使用しています。これらのクエリ パラメータの名前や、ワイルドカード構文が使用されているかどうかは問題ではないと思います。

どちらのアプローチも同じように RESTFul です。

于 2012-09-11T13:39:41.040 に答える