2015-11-09 5 views
8

問題(または欠落している機能)は、異なるクエリパラメータ間での表現可能性の欠如です。パラメータの間にはandしか指定できませんが、not equalor、またはxorのいずれかにしたい場合はどうすれば解決できますか? ?名前=ボッセREST APIのクエリパラメータ間で高度な式を表現するにはどうすればよいですか?

| 20歳または名前を持つすべてのユーザーボッセ

/ユーザー年齢= 22

:私はのようなものを表現できるようにしたいと思い

DavidとLennartを除くすべてのユーザー

/ユーザー名=デビッド&名=レナート

私の最初のアイデアは_filterと呼ばれるクエリパラメータを使用して、このように私の表現で文字列を取ることです:?!

とを持つすべてのユーザー22歳またはボッセ

/ユーザー?_filter =年齢EQ 22または名前NEQない名前ボッセ

この問題の最適な解決策は何ですか?

私はJavaとJerseyでAPIを作成していますので、Jerseyの特別なソリューションがあれば教えてください。

ので、ここでそれはあなたが+追加できるか でOK
+0

私が知っているように、この用途のためにすぐに使用できるソリューションはありません。あなたが言ったようなフィルタ属性でクエリを転送し、フィルタを解析して解析された式に反応してクエリを実装します。 – Simulant

+0

これらの文字をエンコードすることができます。https://en.wikipedia.org/wiki/Character_encodings_in_HTML – Thevenin

+0

@Thevenin:これをどのように使用できるかの例を挙げてください。 –

答えて

3

私はそれを達成するために2つのソリューションを見ることができます:GETメソッドの実行時に式を含む特殊なクエリパラメータを使用して

  • 。これは方法OData$filterパラメータで行います(このリンク:https://msdn.microsoft.com/fr-fr/library/gg309461.aspx#BKMK_filterを参照)。

    /AccountSet?$filter=AccountCategoryCode/Value eq 2 or AccountRatingCode/Value eq 1 
    

    Parse.comもそのwhereパラメータで、このようなアプローチを使用するが、クエリはJSON構造(このリンク参照:https://parse.com/docs/rest/guide#queries)を用いて記述される:ここでサンプルです。ここではサンプルです:

    curl -X GET \ 
        -H "X-Parse-Application-Id: ${APPLICATION_ID}" \ 
        -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \ 
        -G \ 
        --data-urlencode 'where={"score":{"$gte":1000,"$lte":3000}}' \ 
        https://api.parse.com/1/classes/GameScore 
    
  • それが説明するにはあまりにも困難なものなら、あなたもPOSTメソッドを使用して、要求ペイロードにクエリを指定することができます。 ElasticSearchは、このようなアプローチをクエリのサポートに使用しています(このリンク:https://www.elastic.co/guide/en/elasticsearch/reference/current/search.htmlを参照)。ここではサンプルです:高度な表現がために行く持っている場合であれば

    $ curl -XGET 'http://localhost:9200/twitter/tweet/_search?routing=kimchy' -d '{ 
        "query": { 
         "bool" : { 
          "must" : { 
           "query_string" : { 
            "query" : "some query string here" 
           } 
          }, 
          "filter" : { 
           "term" : { "user" : "kimchy" } 
          } 
         } 
        } 
    } 
    ' 
    

は ...あなたがqueryparamsのために行く場合はちょっと、それは不可能だ ティエリ

+0

ありがとうございます。私はparse.comのソリューションが本当に好きなので、実装しようと考えています。何もうまくいなければ、私は数日後に回答を受け入れます(私がテスト実施をした後)。 –

+0

あなたは大歓迎です!クエリを記述するためにJSONを使用すると、特にNodeアプリケーションにとって利点があることは明らかです。 –

2

- また、APIは非常に直感的です。このように

For excluding 
GET /users?name=-David,-Lennart 
For including 
GET /users?name=+Bossee 
For OR 
GET /users?name=+Bossee&age=22&inclusive=false 
For AND 
GET /users?name=+Bossee&age=22&inclusive=true 

非常に読みやすい を含めるか除外すると、ANDのための包括的なフィルタキーワードとOR

んあなたがしたい仕事。

EDIT - 非常に非常に難しい質問、しかし私はそれをこのように行うだろう最初の関係を意味

GET /users?name=+Bossee&age=22&place=NewYork&inclusive=false,true 

は含んでいません - 換言すれば、それはあるOR 第2の関係は包括的である - あるいは他に言葉はAND

評価は左から右への検討である。

+0

私はこの解決策が嫌いです。デフォルトの動作であるときに「+」を追加するのはなぜですか? '非真実=真実 'とはどういう意味ですか?私の推測では、前にクエリパラメータの間に 'または'をつけたいということです。同じステートメントの中で 'と'と 'と'の両方を表現したいのですが?私はあなたの答えを誤解する可能性があります。その場合は明確にしてください。 –

+0

'+'シンボルは(時には)スペースをエンコードするために使用されるので意味はありません。 [この質問](http://stackoverflow.com/questions/1634271)も参照してください。 – lefloh

+0

私が '+'をデフォルトの動作とみなし、 '='のみを使用するとOKです。残りの質問は、この解決策で '(x == 1 || x == 2)&& y == GURP'のように表現する方法です。 –

0

、それはあなたのお役に立てば幸いですPathParamsので、フィルタリングする正規表現が必要になります。

しかし、特定の名前= "Bosse"のみを許可するには、厳密な正規表現を書く必要があります。

条件のためだけRESTエンドポイントを取るのではなく、任意の名前の値を許可してから、プログラムで手動でチェックするロジックを記述する必要があります。

+0

私はあなたが何を意味するかは分かりません。あなたは例を見せてもらえますか? –

関連する問題