2015-11-09 13 views
8

Il problema (o caratteristica mancante) è la mancanza di possibilità di espressione tra diversi parametri di query. A mio avviso, è possibile specificare solo and tra i parametri, ma come risolverlo se si desidera avere not equal, or o xor?Come esprimere le espressioni avanzate tra i parametri di una query in un'API REST?

Mi piacerebbe essere in grado di esprimere le cose come:

Tutti gli utenti con il 20 l'età o il nome Bosse

/utenti di età = 22 | name = Bosse

?

Tutti gli utenti tranne David e Lennart

?!!

/utenti name = David & name = Lennart

La mia prima idea è quella di utilizzare un parametro chiamato interrogazione _filter e prendere una stringa con la mia espressione in questo modo:

Tutti gli utenti con con 22 anni o un nome che non è Bosse

/utenti? _filter = età eq 22 o il nome neq Bosse

Qual è la migliore soluzione per questo problema?

Sto scrivendo la mia API con Java e Jersey, quindi se c'è qualche soluzione speciale per Jersey, fammi sapere.

+0

come so, non esiste una soluzione pronta per l'uso per questo caso. Trasferisci la query in un attributo filtro come hai detto e implementa la query analizzando il filtro e reagendo all'espressione analizzata. – Simulant

+0

Puoi codificare questi caratteri: https://en.wikipedia.org/wiki/Character_encodings_in_HTML – Thevenin

+0

@ Thevenin: Puoi fare un esempio su come potrei usarlo? –

risposta

3

posso vedere due soluzioni per raggiungere tale:

  • Utilizzando una speciale parametro di ricerca contiene l'espressione quando esegue un metodo GET. È il modo in cui OData fa con il suo parametro $filter (vedere questo collegamento: https://msdn.microsoft.com/fr-fr/library/gg309461.aspx#BKMK_filter).Ecco un esempio:

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

    Parse.com inoltre usa tale approccio con il suo parametro where ma l'interrogazione viene descritta una struttura JSON (vedere il link: https://parse.com/docs/rest/guide#queries). Ecco un esempio:

    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 
    
  • Se si tratta di qualcosa di troppo difficile da descrivere, si potrebbe anche usare un metodo POST e specificare la query nella richiesta payload. ElasticSearch utilizza tale approccio per il supporto di query (vedere questo collegamento: https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html). Ecco un esempio:

    $ 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" } 
          } 
         } 
        } 
    } 
    ' 
    

Spero che ti aiuta, Thierry

+0

Grazie per la risposta. Mi è piaciuta la soluzione di parse.com, quindi penso che proverò a implementarlo. Se non succede nulla di meglio, accetterò la tua risposta tra un paio di giorni (dopo aver effettuato un'implementazione di test). –

+0

Prego! È chiaro che l'utilizzo di JSON per descrivere le query ha vantaggi soprattutto per le applicazioni Node ;-) –

2

OK ecco che è Si potrebbe aggiungere + o - per includere o escludere, e una parola chiave inclusiva filtro per AND e OR

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 

In questo modo le API sono molto intuitivi, molto leggibile fa anche il lavoro che vuoi che faccia.

EDIT - domanda molto molto difficile, ma vorrei farlo in questo modo

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

Il che significa che la prima relazione non è compreso - o in altre parole è O seconda relazione è compreso - o in altri parole è AND

La soluzione è con la considerazione che la valutazione va da sinistra a destra.

+0

Non mi piace questa soluzione. Perché dovrei aggiungere "+" quando è il comportamento predefinito? Cosa significa "inslusive = true"? La mia ipotesi è che ciò significa che voglio un 'o' tra i parametri della query prima. Cosa succede se desidero esprimere sia 'and' che' or' nella stessa dichiarazione? Potrei fraintendere la tua risposta, in tal caso ti preghiamo di chiarire. –

+0

Il simbolo '+' è (a volte) usato per codificare uno spazio in modo da non dargli un significato. Vedi anche [questa domanda] (http://stackoverflow.com/questions/1634271). – lefloh

+0

Se considero '+' come comportamento predefinito e uso solo '=', sarebbe ok. La domanda rimanente è ancora come esprimo qualcosa come '(x == 1 || x == 2) && y == GURP' con questa soluzione. –

0

Hey sembra impossibile se si va per queryparams ... Se è il caso di avere espressioni avanzate vanno per PathParams in modo da avere le espressioni regolari da filtrare.

Ma per consentire solo un nome particolare = "Bosse" è necessario scrivere una regex rigorosa.

Invece di prendere un punto finale REST solo per condizione, consentire qualsiasi valore di nome e quindi è necessario scrivere la logica per verificare manualmente con nel programma.

+0

Non credo di ottenere ciò che intendi. Puoi mostrare un esempio? –

Problemi correlati