2012-04-15 19 views
5

Sto scrivendo una piccola app che fa una cosa sola: prende alcuni dati forniti dall'utente, fa delle analisi su di essa e restituisce un "tag" per quei dati. Sto pensando che il cliente dovrebbe o GET o POST la loro richiesta a /getTag per ottenere una risposta indietro.Corretto un modo RESTful per gestire una richiesta che non sta davvero creando o sta ottenendo qualcosa?

Nulla viene memorizzato sul server quando il client esegue questa operazione, quindi è strano usare un POST. Tuttavia, non esiste nemmeno un URI uniforme per l'analisi, quindi l'uso di un GET è strano, poiché restituirà cose diverse a seconda dei dati forniti.

Qual è il modo migliore per rappresentare questa funzionalità con REST?

risposta

1

POST può rappresentare l'esecuzione di un'azione. L'azione non ha un'azione come database.

Quello che hai veramente creato è una procedura remota. RPC di solito è tutto POST. Non penso che questo sia adatto per REST, ma questo non deve impedirti di utilizzare semplici URL e JSON.

2

Il "modo migliore" è quello di fare tutto ciò che è più appropriato per la vostra applicazione e le sue esigenze. Non sapendo che, qui ci sono alcune idee:

  1. GET è il verbo più appropriato dal momento che non sta creando o memorizzare nulla sul server, solo il recupero di qualcosa che il server fornisce.

  2. Non inserire la parola get nell'URI come suggerito. Verbi come quello sono già forniti da HTTP, quindi usa solo /tag e GET invece.

  3. È necessario utilizzare un URI ben compreso (o "interessante") per questa risorsa e trasmettere i dati come parametri di query. Non mi preoccuperei se mi sentivo strano (vedi le risposte this question's per scoprire perché).

In sintesi, solo GET su /tag?foo=bar&beef=dead, e il gioco è fatto.

1

Mi sembra che ci sarebbe probabilmente un motivo per cui tu o l'utente che ha generato i dati originali vorrebbe che il tag generato continui, vero?

Se questa è una possibilità, la scriverò come POST /tags e passerò l'URI di risorsa /tags/:id come un'intestazione Location :.

Se davvero non mi importava di mantenere il tag generato, pensavo a cosa erano i "dati generati dall'utente" e quanta elaborazione stava avvenendo dietro le quinte. Se il "tag" è abbastanza diverso da qualsiasi dato viene passato nel sistema, GET /tag potrebbe essere davvero confuso per un utente API.

0

In secondo luogo la risposta di Brian: utilizzare un GET. Se gli stessi parametri di input restituiscono lo stesso output e non stai creando nulla, è un'azione idempotent e quindi perfettamente adatto per uno GET.

0

È possibile utilizzare GET e POST uno:

  • GET /tag?data="..." -> 200, tag

    Il metodo GET significa recuperare tutte le informazioni (sotto forma di un entità) è identificato dal Request-URI. Se l'URI di richiesta fa riferimento a un processo di produzione di dati, sono i dati prodotti che devono essere restituiti come entità nella risposta e non il testo di origine del processo , a meno che il testo non sia l'output del processi.

  • POST /tag {data: "..."} -> 200, tag

    L'azione svolta dal metodo POST potrebbe non risultare in una risorsa che può essere identificato da un URI. In questo caso, 200 (OK) o 204 (Nessun contenuto) è lo stato di risposta appropriato, a seconda che o meno la risposta includa un'entità che descrive il risultato.

secondo l'/ method definitions sezione standard HTTP.

Vorrei usare GET se fossi in te (e POST solo se si desidera inviare file).

Problemi correlati