2011-09-06 6 views
18

Sto scrivendo una API RESTful e sto pensando al processo di creazione di una chiave da parte di un utente. Ho le seguenti possibilità:Le richieste PUT e POST richieste/previste hanno un corpo di richiesta?

  • richiesta GET a /new/<keyname> - anche se è molto facile Penso che non userò questo, perché ho sentito GET è per il recupero e/o annuncio informazioni;
  • Richiesta POST a /<keyname> - Questo mi è sembrato facile e abbastanza semplice, ma non trasmette alcun dato nel corpo della richiesta. Posso farlo in questo modo? È strano?
  • Richiesta POST a /keys passaggio nel corpo della richiesta "keyname=SomeKey" - È il modo corretto?

Ho guardato a this API from joyent e in tutte le loro richieste PUT e POST passano alcuni dati nel corpo della richiesta. È previsto? È davvero sbagliato non richiedere un corpo di richiesta in una richiesta PUT e POST?

risposta

14

Ho fatto questa domanda sul Http-WG. Questa è stata la risposta più precisa che ho ottenuto http://lists.w3.org/Archives/Public/ietf-http-wg/2010JulSep/0276.html

In sintesi, il POST non richiede un corpo. Mi aspetterei che la stessa giustificazione possa essere applicata a PUT.

+5

Il POST richiede un corpo, ma quel corpo può essere un documento vuoto. La differenza è sottile, ma non è la stessa cosa. Ad esempio, hai ancora un mimetype per il documento vuoto. –

+1

@PedroWerneck Puoi fornire un riferimento per tale asserzione? Quello che ho letto non è coerente con quella prospettiva. –

+1

Ecco cosa sta dicendo la risposta che hai postato. Un corpo a lunghezza zero non è la stessa cosa di nessun corpo. Devi ancora inviare alcuni metadati associati a un documento vuoto. –

-1

Probabilmente il modo migliore è la terza opzione: POST a /keys con keyname=SomeKey.

Ecco perché: È possibile aggiungere un'altra funzione all'API, ad esempio create_new_user. Sarebbe quindi difficile stabilire la differenza tra un utente che tenta di POST una chiave denominata create_new_user e un utente che tenta di utilizzare la funzione create_new_user.

Si ha ragione nel dire che non si deve utilizzare GET per eseguire questa operazione come operazione GET "SHOULD NOT have the significance of taking an action other than retrieval." (RFC 2616).

5

RFC2616 is the base RFC for HTTP 1.1

Nella forma più generale, un messaggio HTTP è questo (notare il corpo opzionale):

generic-message = start-line 
        *(message-header CRLF) 
        CRLF 
        [ message-body ] 
start-line  = Request-Line | Status-Line

la lettura di questo dà questo:

9.5 POST 

    The POST method is used to request that the origin server accept the 
    entity enclosed in the request as a new subordinate of the resource 
    identified by the Request-URI in the Request-Line. ... 

e

9.6 PUT 

    The PUT method requests that the enclosed entity be stored under the 
    supplied Request-URI. ... 

    The fundamental difference between the POST and PUT requests is 
    reflected in the different meaning of the Request-URI. The URI in a 
    POST request identifies the resource that will handle the enclosed 
    entity. That resource might be a data-accepting process, a gateway to 
    some other protocol, or a separate entity that accepts annotations. 
    In contrast, the URI in a PUT request identifies the entity enclosed 
    with the request -- the user agent knows what URI is intended and the 
    server MUST NOT attempt to apply the request to some other resource.

Entrambi POST e PUT includono la frase entità inclusa nella richiesta.

Sulla base della mia lettura, credo che si desideri un corpo (una descrizione non normativa, lo so) per POST e PUT.

Nell'ambito di RIPOSO, POST è creare e PUT è aggiornare. Posso immaginare di creare un oggetto vuoto (forse un segnaposto per informazioni future), ma non immagino molto l'uso di un aggiornamento vuoto.

+5

Cosa intendi con "nel contesto di REST"? Dove REST ridefinisce il significato del metodo POST HTTP? –

+0

Un POST REST è una richiesta di creazione. Posso immaginare situazioni in cui voglio creare una risorsa identificata da un URL utilizzando tutti i valori predefiniti (forse identificati da un corpo vuoto). – DwB

+6

Un POST non è necessariamente una richiesta di creazione. "Creare una risorsa sub-ordinata" è solo uno dei significati suggeriti. Tutte le specifiche http dicono di POST è che è pericoloso e non idempotente. La semantica rimanente non è specificata. –

-1

Per rispondere alla domanda in un'unica riga. Sì, è previsto che abbia Corpo/Contenuto nel corpo, ma non è obbligatorio (Obbligatorio).

-1

Secondo okHttp3 (una libreria HTTP per Android): i seguenti metodi richiedono un corpo: POST, PUT, PATCH, PROPPATAT (WebDAV) e REPORT (source). Si blocca anche se si tenta di fare una richiesta con i metodi dati senza un corpo.