2010-10-01 16 views
6

NOI stiamo progettando un'app per iPhone che richiamerà un servizio RESTful in esecuzione in Tomcat. Abbiamo bisogno di inviare molti parametri di ricerca e abbiamo superato il limite massimo consentito dal telefono.Chiamare un servizio RESTful con * molti * parametri

Sarebbe RESTful utilizzare una chiamata PUT con i parametri nel corpo, anche se l'intento non è quello di modificare il server? Un POST non sembra corretto perché non è idempotente, mentre un PUT è (e quindi ricorda più da vicino il comportamento o di un GET).

Grazie.

+0

È JSON o XML? – Aliostad

+4

I principi e lo spirito di REST sono molto più importanti del tuo prodotto. Pertanto, il tuo prodotto non dovrebbe esistere. Mark

+3

@Mark: punto eccellente. Se non puoi seguire lo spirito della legge, basta interrompere lo sviluppo! Perché non ci ho pensato? In questo momento sto chiamando il mio capo e gli dico che questo pazzo modello di dati non si adatta al modello relazionale originale come articolato da Chen, e dovremmo davvero smettere di lavorare. Eccellente! –

risposta

4

Se lo si desidera RESTful, è possibile procedere in questo modo: PUT i parametri sul server (in una posizione di propria scelta), oppure è possibile POSTli e lasciare che il server li posiziona per voi. In entrambi i casi, hai appena creato una risorsa che contiene i parametri necessari. Quindi si invia un GET riferendosi a quella particolare risorsa. Rispondendo al tuo GET, il server quindi sa dove ottenere il suo ampio set di parametri. Quello sarebbe RESTful.

Detto questo, tuttavia, l'invio di due richieste non è molto efficiente, se è possibile fare la stessa cosa con una singola richiesta. Vorrei solo provare a essere pragmatico.

Considerate questo: PUT dice proxy che non dovrebbero in cache la risposta, ma un nuovo tentativo (da alcun elemento di infrastrutture lungo la linea) è sicuramente possibile, dal momento che è idempotente (proprio come GET). Cosa ti dà GET oltre PUT? La risposta può essere memorizzata nella cache. Ma con quel gran numero di parametri, suppongo che la maggior parte delle richieste sarà comunque unica, giusto? Di conseguenza, la memorizzazione nella cache non è molto redditizia. Pertanto, l'uso di PUT sembra essere il pragmatico e quindi la scelta corretta.

+0

Come ho detto in un commento precedente, il motivo per cui abbiamo molti parametri è che ognuno è l'ID di un record già presente sull'iPhone. Stiamo cercando di evitare di inviare nuovamente quei record su un aggiornamento. Il tuo commento sulla non memorizzazione nella cache e sull'unicità è a proposito. – Ralph

1

Violare lo spirito di REST, ma se funziona, sii pragmatico.

+0

Esiste un modo RESTful per farlo? Non sono un attaccabrighe per la lettera della legge (o specifica in questo caso), ma vorrei seguire gli standard se c'è un modo. – Ralph

6

avete tre opzioni che sono massimamente conforme con http:

In primo luogo, si ha la possibilità di inviare le vostre params compressi in qualche modo a formare un URL più breve.

In secondo luogo, non c'è niente di GET che dice che non è possibile inviare un messaggio-corpo nella richiesta, in qualunque Content-Type o -Length si sceglie. Non tutti i server supportano questo, ma lo stesso protocollo HTTP.

In terzo luogo, si possono inviare i parametri a una risorsa /queries/, e hanno che rispondono con 201 Created e un nuovo URL (come /queries/78a65g82) nell'intestazione Location risposta, che il cliente quindi chiama GET su (più volte, o anche in Ranges , se questo è un vantaggio) per recuperare il risultato.

+4

Penso che potresti scoprire che alcuni proxy non inoltrano il corpo di una richiesta GET. –

+0

Come il set Darrel, non dovresti passare i payload dei messaggi GET, potrebbe funzionare con il tuo dev-setup, ma può crashare nel tuo prod-setup. È troppo poco affidabile e il routing (e i proxy coinvolti) spesso non sono sotto il tuo controllo. –

+0

+1 per il suggerimento/query/78a65g82, questo è quello che usiamo. – balupton

Problemi correlati