3

レコードに含まれる値のコレクションをフィルター処理するリソースの URI を作成する良い方法を探しています。たとえば、レシピ データベースがあり、「チェリー」を含むレシピを検索したいとします (明らかに、ほとんどのレシピには複数の材料が含まれます)。

単一の値でフィルタリングしたい場合は、次のようなことができます。

/recipe/search/?name=Spaghetti

しかし、複数の値でフィルタリングする場合はどうでしょうか? 次のようなことを検討していました。

/recipe/search/?ingredients=contains=cherry

これについて何か考えはありますか?この種のフィルターの「標準」はありますか?

更新:私のアイデアに関する問題の 1 つは、バックエンド (私の場合は Rails) での処理方法です。この特定の形式でサーバーにクエリを実行すると、Rails は次のような見苦しい Ruby ハッシュを生成します。

{"ingredients"=>"contains=cherry",
"action"=>"search",
"controller"=>"recipe"}
4

3 に答える 3

3

あなたのURI

まず第一に、他の回答とは対照的に、REST視点から始めて、それに適切な追加を見つけます。私は Ruby が得意ではないので、バックエンドでノーコードで我慢してください。


  1. レシピは、ユーザーに提示したいエンティティです。/recipies
  2. HTTP にはフィルタリング用
    の QUERYS があります。これらのレシピを日付でソートしたいですか? 使用する/recipies/?sortby=date&sort=asc
  3. さくらんぼを使ったレシピのみが同様になります。/recipies/?ingredients=cherry

これが、基本 URL を構造化する REST の方法です。
複数の試合の場合、それを行う公式の方法はありませんが、user1758003 に従います。これは URL の直感的な構造であり、バックエンドで簡単に解析できるため、/recipies/?ingredients=cherry,chocolate

ミラーリングし、独立したエンティティを表していない/recipies/searchため、安らかではないことを忘れないでください。recipiesただし、サイトへの訪問者向けの検索フォームをホストするのに最適な場所です.

ここで、最初の質問にいくつかの追加の質問が詰め込まれています。1 つずつ説明しましょう。

この API を使用する Web サイトを持っていますが、検索フォームはどのように表示されますか?

訪問者に/recipie/searchページを提供するか、/recipies. を設定するだけ<form action="/recipies" type="GET">です。ブラウザは、すべてのパラメータを の後にクエリ文字列として追加します/recipies

高度な機能

/recipiesすべてをリストする要求。クエリを追加する場合、クエリのすべてのパラメーターを尊重する必要があります。したがって、/recipies/?ingredients=cheese安っぽいレシピのみを返さなければなりません。クエリ パラメータの値を乗算する場合、一定の基準はありませんが、サービスを直感的に使用できるようにしたいと考えています。
と読みGET /recipies/?ingredients=cherry,chocolateますGet me the recipies which have ingredients of cherry and chocolate。チェリーまたはチョコレートのいずれかを含むレシピのリストを取得するには、URI を次のように記述します。/recipies/?ingredients=cherry|chocolateこれにより、視覚的にコンマとは大きく異なり、プログラミング コンテキストで定義済みの意味 (OR) を持ちます。

于 2013-03-28T15:49:24.267 に答える
2

ルビー ハッシュの詳細については詳しくありませんが、http とデータ アクセス レベルの両方でクエリを一意に識別するためにハッシュが作成されているのではないでしょうか。

とにかく、クエリ パラメータで json を使用する場合は、URL エンコーディングに注意する必要があります。心に留めておくべきもう 1 つのことは、「検索」という用語は繰り返しと見なされる可能性があることです。サーバーが GET メソッドを使用してアクセスされていて、基準がある場合は、バックエンドの状態を変更していないことを願っています。あなたの質問ではありませんが、私はそれについて言及したいと思いました。

そう...

https://yourserver.com/approot/recipe/search?ingredients=cherry,cheese&type=cake

HTTP はカンマをクエリ文字列の区切り記号として定義していないため、フレームワークは 2 つのクエリ文字列パラメーターを解析できるはずです。

材料: 「チェリー、チーズ」

これは、split または ruby​​ が提供する同等の関数を使用して簡単に配列に変換できるはずです。

type: "cake" (要点を説明するために追加のクエリ用語が追加されました。チェリー チーズ ケーキは素晴らしく、ケーキは材料ではないためです)

あなたの例を正しく理解していれば、次のようになります。

{
"ingredients"=>"cherry,cheese",
"type"=>"cake",
"action"=>"search",
"controller"=>"recipe"
}

これはあなたが探しているものですか?

于 2013-03-26T22:51:15.163 に答える
1

JSONデータのみを使用するREST Webサービスのほとんど。したがって、単一の文字列値のみを返すJSON形式を使用してください。この JSON 形式から、配列値も送信できます。

配列値の場合、その配列を次のような JSON 形式に変換することを意味します

PHPから:

$ingredients = array('contains'=>array('fruits'=>'cherry,apple','vitamins'=>'a,d,e,k'));
$ingredients_json = json_encode($ingredients);
echo $ingredients_json;

次のようなjson形式を返します。

 {"contains":{"fruits":"cherry,apple","vitamins":"a,d,e,k"}} 

このJSON文字列をURLで使用できます

/recipe/search/?ingredients={"contains":{"fruits":"cherry,apple","vitamins":"a,d,e,k"}}

サーバー側では、この JSON 形式の値を配列にデコードするオプションがあります。

{"ingredients"=>"{\"contains\":{\"fruits\":\"cherry,apple\",\"vitamins\":\"a,d,e,k\"}}",
"action"=>"search",
"controller"=>"recipe"}
于 2013-03-26T05:59:51.023 に答える