2012-12-09 9 views
7

Sto progettando un'API RESTful.Come progettare URI REST per più parametri valore-chiave di HTTP GET

Un servizio deve offrire funzionalità di interrogazione per più coppie di valori-chiave. Ad esempio, il client può eseguire una query con una richiesta HTTP GET per prodotti diversi e la quantità associata.

Il cliente vuole interrogare prodotto 1 con la quantità di prodotto 44 e 2 con la quantità 55. Io in realtà non voglio che il mio URI a guardare come questo:

/produkt?productId1=1&productquantity1=44&productId2=2&productquantity2=55 

perché non so quanti prodotti vengono interrogati

O come questa:

/produkt?product=1,44&product=2,55 

perché come può il cliente sapere che prima della virgola c'è il productId e dopo la virgola la quantità.

Qualcuno ha altre soluzioni? O non è RESTful offrire la possibilità di interrogare più prodotti con una sola richiesta? È meglio offrire la possibilità di interrogare un solo prodotto con la quantità associata e se il cliente desidera interrogare più prodotti, dovrebbe inviare più richieste?

+0

Cosa sarebbe sbagliato inserire le informazioni di query in un http-post? – schippi

+2

@schippi Nulla, eccetto che non sarebbe RESTful :) – dasblinkenlight

+0

I servizi web RESTful non devono essere esclusivamente basati su GET.Si potrebbe facilmente avere un servizio RESTful che richiede la trasmissione di più dati di quelli che possono essere inclusi in una richiesta GET. È ragionevole utilizzare qualsiasi metodo HTTP. Vedi: http://en.wikipedia.org/wiki/Representational_state_transfer#Vocabulary_re-use_vs._its_arbitrary_extension:_HTTP_and_SOAP – Michael

risposta

2

Vorrei estendere il tuo secondo suggerimento un po 'con l'aggiunta di nomi espliciti per le parti del vostro prodotto, e l'utilizzo di un punto e virgola al posto di virgole per prodotto separato attributi, dal momento che l'ordine non importa *.

/products?id=1;qty=44&qty=55;id=2 

Si noti come id e qty vengono commutate in giro per il secondo prodotto, perché l'ordine degli attributi non importa.


* C'è una convenzione per utilizzare le virgole quando l'ordine è importante, e punti e virgola quando l'ordine non è importante.

+0

Come posso iniettare quei parametri nel mio servizio REST? Lo so, devo usare @ QueryParam-Annotation, ma come dovrei usare questo? – joshi737

5

Ecco un'idea di passare un parametro:

/products?productDetail=[{"key":"key0","value":"key1"},{"key":"key2","value":"key2"},{"key":"key3","value":"key3"}] 

dove

[{"key":"key0","value":"key1"},{"key":"key2","value":"key2"},{"key":"key3","value":"key3"}] 

è una rappresentazione JSON della classe List<kv>

class kv { 
    String key; 
    String value; 


    public kv(String key, String value) { 
     super(); 
     this.key = key; 
     this.value = value; 
    } 

    public String getKey() { 
     return key; 
    } 

    public void setKey(String key) { 
     this.key = key; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

} 

in modo da poter facilmente convertire parametro di query productDetail in a List<kv> utilizzando

new Gson().fromJson(productDetail,kv.class); 

di quanto si possa facilmente iterare tutti gli elementi.

Un altro suggerimento è, se non si conosce quanti prodotti vengono interrogati, utilizzare una richiesta POST per questo.

+0

Come questa idea, prenderei in considerazione la possibilità di inserire (query dovrebbe essere idempotente) il JSON, invece di usare la query GET. – Stefan

Problemi correlati