2009-05-16 5 views
6

Se ho capito correttamente, nello stile di riposo, ogni query (ovvero ogni azione su ogni risorsa che non modifica lo stato della risorsa) dovrebbe essere codificata nella stringa di query, utilizzando un metodo get, senza alcun corpo.Come passare query complesse in REST?

Ho ragione?

Bene, ho diverse applicazioni che comunicano con il db attraverso un messaggio XML gestito da un componente di Visual Basic 6.

il messaggio per una query è qualcosa di simile

<xml> 
    <service>account</service> 
    <resource>invoice</resource> 
    <action>query</action> 
    <parameters> 
    <page>1</page> 
    <page_len>10</page_len> 
    <order>date</order> 
    <fields>*</fields> 
    <conditions> 
     <date>2009-01-01..2009-01-31</date> 
     <customer_id>24</customer_id> 
    </conditions> 
    </parameters> 
</xml> 

In questo momento siamo in procinto di ridisegnare i nostri messaggi XML, e ci piacerebbe farlo in modo tale che potessero essere facilmente mappato su un'interfaccia RESTful.

Nell'esempio precedente, abbiamo bisogno dei tag "condizioni" per evitare collisioni tra i parametri e le condizioni (ad esempio, cosa succede se ho un campo chiamato "ordine", "pagina" o qualcosa del genere. ..

Noi però circa l'invio dei parametri con un prefisso, qualcosa come

http://account/invoice/?_page=1&_page_len=10&_order=date&_fields=*&date=2009-01-01..2009-01-31&customer_id=24 

e l'XML sarebbe qualcosa di simile

[...] 
    <_order>date</_order> 
    <_fields>*</_fields> 
    <date>2009-01-01..2009-01-31</date> 
    <customer_id>24</customer_id> 
[...] 

Noi stanno cercando di definire un formato XML veramente semplice per le operazioni di crudismo e che l'XML risultante potrebbe essere facilmente mappato su rest o JSON.

Come si mapperà questo tipo di query in un'applicazione di riposo? C'è qualche standard definito? o qualche pagina con campioni di crude/XML/JSON? che ne dici di restituire l'errore o i dataset annidati?

Grazie mille.

risposta

6

IMHO per rendere il sistema veramente RESTful è necessario ripensare a tutti i messaggi/query che si invieranno.

Questa parte:

<conditions> 
    <date>2009-01-01..2009-01-31</date> 
    <customer_id>24</customer_id> 
</conditions> 

è la parte difficile. Che tipo di altre condizioni hai? Ci sono molti? Questo particolare esempio mi fa pensare che puoi trattare le fatture come una risorsa secondaria di un cliente. Quando resto a riposo cerco sempre di identificare la risorsa nel percorso e se una query stil ha bisogno di parametri, li sposto nella stringa di query. Quindi mi piacerebbe scrivere qualcosa di simile:

GET /customers/24/invoices?start_date=2009-01-01&end_date=2009-01-31 

Pensateci relazioni tra le risorse. Diciamo che abbiamo un tipo di risorsa Foo relativo al tipo di risorsa Bar di una relazione a molti. In questo caso puoi chiedere di questa relazione come questa: GET /foo/123/bar e aggiungere parametri stringa di query per filtrarlo. Il problema inizia quando vuoi filtrarlo in un modo che implica relazioni con altre risorse. IMHO questo significa che il tuo design delle risorse non è veramente RESTful.

0

Avresti bisogno di url-encode l'xml per poterlo passare, ma, se hai convertito il xml in json, potresti passare quella stringa e poi json-> xml o json-> object per elaborarla. Ciò ti consentirebbe di passare oggetti più complessi in giro.

Non è perfetto, ma funziona. :)

+0

Io capisco il tuo approccio, ma mi piacerebbe fare come si farebbe seguendo i principi di riposo, non solo riempire il mio xml nella queryString ... – opensas

+0

Dipende se, come è stato detto, puoi ripensare a come dovrebbe essere l'invio di dati, ma se si stanno solo inviando dati da inserire nel database, quindi la codifica in modo che possa essere inviato in un URL ha senso. Se si utilizza GET, si avrà un approccio diverso. –