2016-09-23 14 views
2

私のアプリケーションが以下のフィールドを持つワークロードと呼ばれるオブジェクトを管理しているとします。私は、ユーザーがワークロードをラベルで照会するためのRESTインターフェースを公開したいと考えています。フィルタを使用してクエリを実行するにはどのような方法がありますか?

"Workload": {"id":"test1", "labels":["A", "B", "C"]} 
"Workload": {"id":"test2", "labels":["A", "C", "D"]} 
"Workload": {"id":"test3", "labels":["A", "B", "D"]} 

質問:それはフィルタとして複数ラベルでクエリのワークロードをサポートしていますように、どのように私はRESTエンドポイントを設計していますか?

サンプルクエリ1GET "A"と "B"の両方を含むすべてのワークロードにします。

私はGETという動詞を、エンドポイントとしてと考えていますが、{"labels": ["A", "B"]}をリクエスト本体として使用しています。しかし、これはRESTfulなやり方のようには見えません

また、私はGET /labels/{label-id}/workloadsを行うことができますが、これは1回のラベルでしか動作しません。

サンプルクエリ2:私はGETラベル「A」または「B」が、ノー「C」を持つすべてのワークロードにする方法で、すべての残りのAPIのこの種を行うには、他の

全く分かりませんユーザーにA、B、Cで別々に問い合わせるように依頼してから、適切な設定操作を自分で行うのですか?

2番目のクエリはtracked as another question

+0

クエリパラメータに問題がないとは思わない。あなたがそれらを避けたい理由がありますか? – mrmcgreg

+0

私はクエリーパラメータを繰り返すかどうかを疑問に思っていました。私は 'golang'で自分のアプリケーションをコーディングしているので、現在のところ、単一のライブラリのみをサポートしているパラメータを自動的に解析するのに役立つ[サードパーティのライブラリ' httprouter'](https://github.com/julienschmidt/httprouter)を使用していますクエリパラメータ... 'workload /:workload_id/labels /:label_id'のようなもの – cookieisaac

答えて

1

GET動詞が体を要求しとるではありません。あなたは 'workload/labels/A、B、C'のようなことをする必要があります。 これで、要求照会でA、B、Cが得られます。要求照会とカンマで区切ってレコードを探します。

+0

1. [コンマin URL]を使うことはできますか?(http://stackoverflow.com/questions/198606/can-i-use-commas- in-a-url)。 2. "ラベル 'A'または 'B'が付いているが、 'C'がないワークロードにコンマ区切りのリストを付けて問合せを実行する方法は? – cookieisaac

+0

@cookieisaac URLのコンマはサーバー側のルーティング実装に依存します。あなたが持つことができるnode.js Expressによって、IISによって問題が生じる可能性があります。まずそれをテストする必要があります。 – inf3rno

1

クエリパラメータits finerepeat themを使用します。簡単な例については

GET /workloads?label=A&label=B&label=C 

あなた可能性もornotこのような用語。

GET /workloads?or_label=A&or_label=B&label_not=C 
+1

これは私の状況に十分に見えます。ちょうど私が夢中になり、 'GET/workloads?(label = A || label = B)&label!= C'のようなことをすることができるのだろうか?または、とにかく私は '(AまたはB)not Cのようないくつかの基本的なロジック操作を行うことができます – cookieisaac

+0

あなたは新しい質問として投稿しようとするかもしれません。私は明らかな解決策は考えられません。クエリを定義し、 'GET/queries/{id}/workloads'を使用して結果を取得するために、別の(複数の)リソースが必要になるかもしれません。 –

+0

http://stackoverflow.com/questions/10582066/is-that-クエリ文字列を使用する可能性があります –

0

あなたは、彼らがABを含有することが、唯一の制約ここでは多くのオプションを持っています。例

  • /workloads/?label=["A","B"]
  • /workloads/?label[]=A&label[]=Bためので - 別名。 query string array
  • /workloads/by/label/A+B/
  • /label/A+B/workloads/

既存のURIクエリ規則は、例えば、マイクロソフトODATAのために、同様にあります。 http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part2-url-conventions.html私はODataに慣れていませんが、ドキュメントによれば、彼らのアプローチに従いたい場合は、/WorkloadsByLabels([email protected])[email protected]=["A","B"]のようなものを使うべきです。私の知る限り。複雑なURIフィルタを記述するための標準的な解決策はありません。

+0

これは正当な解決策のようですが、私は決してRESTを見たことがありませんそのように設計されたAPI ...これらは従来のRESTfulエンドポイントのためのものか、主にURI用のものですか?私は[IBM Bluemix REST API](http://ccsapi-doc.mybluemix.net/)のような行に沿って考えていましたが、複雑なクエリをサポートしていないようです... – cookieisaac

+0

@cookieisaacもしあなたが探している標準的なソリューションの場合は、URIテンプレートhttps://tools.ietf.org/html/rfc6570をチェックする必要があります。これはリストタイプを定義します。これはコンマで区切られた項目としてURIに追加されます。残念ながら、すべてのサーバがURIのコンマをサポートしているわけではありません。 IISには問題があります。 Afaikのプラス文字は検索キーワードを分離するために使われています。リスト項目を分けてはいけません。ちょうどヒントです。一方、URIテンプレートは標準であるため、サーバーがサポートしている場合は、idsをカンマで区切ることができます。クエリ文字列配列も標準です。 – inf3rno

関連する問題