2012-12-09 14 views
7

Projektuję RESTful API.Jak zaprojektować REST URI dla wielu par klucz-wartość HTTP GET

Jedna usługa powinna oferować funkcję zapytań dla wielu par klucz-wartość. Na przykład klient może wysłać zapytanie za pomocą jednego żądania HTTP GET dla różnych produktów i związanej z nimi ilości.

Klient chce zapytać produkt 1 z kwotą 44 i produktu 2 z kwotą 55. I rzeczywiście nie ma moja URI wyglądać następująco:

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

bo nie wiem ile produktów jest zapytanych.

Albo tak:

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

bo jak można klient wie, że przed przecinkiem nie jest productId i po przecinku liczbę zdjęć.

Czy ktoś ma inne rozwiązania? Czy też nie jest RESTful oferować możliwość wysyłania zapytań do wielu produktów za jednym razem? Czy lepiej jest oferować możliwość odpytywania tylko jednego produktu z powiązaną ilością, a jeśli klient chce zapytać o więcej produktów, powinien wysłać więcej wniosków?

+0

co byłoby nie tak z umieszczeniem informacji o zapytaniu w poście http? – schippi

+2

@schippi Nic, z wyjątkiem tego, że to nie będzie RESTOWN :) – dasblinkenlight

+0

Usługi sieciowe RESTful nie muszą być oparte wyłącznie na GET.Możesz łatwo mieć usługę RESTful, która wymaga transmisji większej ilości danych niż można uwzględnić w żądaniu GET. Rozsądne jest użycie dowolnej metody HTTP. Zobacz: http://en.wikipedia.org/wiki/Representational_state_transfer#Vocabulary_re-use_vs._its_arbitrary_extension:_HTTP_and_SOAP – Michael

Odpowiedz

2

Chciałbym rozwinąć nieco drugą sugestię, dodając wyraźne nazwy części produktu i używając średników zamiast przecinków, aby oddzielić atrybuty produktu, ponieważ zamówienie nie ma znaczenia *.

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

Uwaga jak id i qty są przełączane dokoła dla drugiego produktu, ponieważ kolejność atrybutów nie ma znaczenia.


* Jest konwencja używać przecinków, gdy zlecenie jest ważne, a średniki, gdy zamówienie nie jest ważne.

+0

Jak mogę wprowadzić te parametry do mojej usługi REST? Wiem, że muszę użyć adnotacji @ QueryParam, ale jak mam jej użyć? – joshi737

5

Oto jeden pomysł, aby przekazać parametr:

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

gdzie

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

jest reprezentacją JSON klasy 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; 
    } 

} 

, dzięki czemu można łatwo przekonwertować parametr zapytania productDetail w List<kv> przy użyciu

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

niż można łatwo iterować wszystkie elementy.

Inną propozycją jest, jeśli nie wiesz, ile produktów jest zapytanych, użyj do tego prośby POST.

+0

Podobnie jak ten pomysł, rozważałbym wstawienie (zapytanie powinno być idempotentne) JSON zamiast użycia zapytania GET. – Stefan