0

そこで、REST API インターフェイスに関して最近行った多くの調査に基づいて、理論的な質問があります。

まず、REST では、リソースは動詞ではなく名詞である必要があり、各リソースは次のリソースから分離する必要がありますが、リソースの目的に応じて、リソースは同じエンティティまたはエンティティのコレクションを返すことができることを理解しています。

ただし、私の焦点は、安らかな検索を実行することです。

私が行ったすべての調査で、私が見つけた最も一般的な解決策は、URL でパラメーターを使用することです。

api.test.com/search-cars?param1=val1&param2=val2

これは標準的な慣行であり、REST のルールを実際に破っているわけではありませんが、検索パラメーターを ID (おそらく JSON の形式) として表す人がいないのはなぜですか?

api.test.com/cars/{"color":"blue","year":"2013","make":"toyota"}

車をリソースとして見て、ID を JSON として表すと、私は本当に有限の数の車を持っているため、ID の有限かつ一意の数を持っていると簡単に言えます。

さらに、これは「resource/id」に準拠することで純粋な休息を促進します

最初の例のようにパラメーターを使用する利点と欠点は何ですか?

2 番目の例のように、JSON を「フィルター」で ID として使用する利点と欠点は何ですか?

API の最初のリソースをどのように進めていくかについて最終決定を下す必要があるため、すべてのコメントは本当に役に立ちます。また、なぜ私がどちらの方法を選択したのかを上司に説明するための強力な議論が必要です。

4

1 に答える 1

3

URL の一般的な形式は次のとおりです。

scheme://domain:port/path?query_string#fragment_id

したがって、次の 2 つの URL を提案します。

  1. によって検索するquery_string
  2. 最後のpathセグメントで検索

によって検索するquery_string

carsではなく、コレクションに名前を付けることをお勧めしsearch-carsます。質問に書いているように、URL はリソースを識別します。carsリソースは、すべての 車のコレクションを識別します。search-cars呼び出されたリソースがどのコレクションを識別するのかわかりません。

GET http://api.test.com/cars

すべての車のコレクションを返します。

GET http://api.test.com/cars/123

は、 によって識別される車を返し123ます。

GET http://api.test.com/cars?color=blue&year=2013

は、2013 年に製造されたすべての青い車のコレクションを返します。

によって検索するpath

2 つ目の URL

GET http://api.test.com/cars/{"color":"blue","year":"2013","make":"toyota"}

クエリ(JSON)をパスの一部にします。2 つの例を同等にするために、JSON をクエリ パラメータにするとします。

GET http://api.test.com/cars?search={"color":"blue","year":"2013","make":"toyota"} 

JSON と名前付きクエリ パラメータ

ほとんどの REST フレームワークは、メソッド パラメーターへのクエリ パラメーターのマッピングをサポートしています。

ほとんどの REST フレームワークでは、パス セグメントをメソッド パラメーターにマップできます。繰り返しになりますが、ほとんどの REST フレームワークでは、JSON をオブジェクトまたは単純な辞書にマップできます。

JSON を使いにくくしているのは、"{}文字をエスケープする必要があることです。

{"color":"blue","year":"2013","make":"toyota"}

になる

%7B%22color%22%3A%22blue%22%2C%22year%22%3A%222013%22%2C%22make%22%3A%22toyota%22%7D

これはあまり良くありません。

概要

  • query_stringURL のと の両方を使用してpath、リソースを識別できます。を精神的に SQLの に変換できるquery_stringため、検索パラメータは に配置することをお勧めします。?WHERE
  • エスケープされた JSON は読みにくいため、URL で JSON を使用しないでください。
于 2013-10-09T18:59:42.473 に答える