È necessaria una richiesta HTTP PUT per includere un corpo?


92

Ho problemi a trovare una specifica precisa di questo nello standard. Ho un client HTTP che non include Content-Length: 0un'intestazione quando eseguo una richiesta PUT in cui non specifico un corpo e un server che viene confuso da tali richieste e mi chiedo quale programma dovrei incolpare.


Perché modifichi una domanda del 2009 se posso chiedere?
zmuci

@zmuci Per una migliore formattazione?
Константин Ван

Risposte:


83

Le richieste HTTP hanno un corpo se hanno un'intestazione Content-Length o Transfer-Encoding ( RFC 2616 4.3 ). Se la richiesta non ha nessuno dei due, non ha corpo e il tuo server dovrebbe trattarla come tale.

Detto questo, è insolito che una richiesta PUT non abbia un corpo, quindi se stessi progettando un client che voleva davvero inviare un corpo vuoto, passerei Content-Length: 0. In effetti, a seconda della lettura del POST e le definizioni del metodo PUT ( RFC 2616 9.5, 9.6 ) si potrebbe sostenere che il corpo è implicitamente richiesto, ma un modo ragionevole per gestire nessun corpo sarebbe quello di assumere un corpo di lunghezza zero.


Come implicano il codice di stato HTTP 200 ("OK"), 201 ("Creato") e 204 ("Nessun contenuto"), una PUTrichiesta è fondamentalmente per creare o aggiornare un file sul server. E non c'è niente di illegittimo nel fatto che un file sia vuoto, non è vero?
Константин Ван


5
@bdonlan hai detto che un PUT con un corpo vuoto è insolito, ma se voglio abilitare o disabilitare un utente non avrò bisogno di un corpo su mia richiesta, in realtà le richieste PUT potrebbero essere "/ users / {id} / enable" o "/ users / {id} / disable".
Vinicius de Almeida

@ViniciusdeAlmeida Queste risorse non sarebbero appropriate se stai cercando di aderire agli standard REST. disablee enablesono verbi. Probabilmente preferirei utilizzare PATCHil /users/{id}punto finale in questo caso.
schiacciare il

42

Non rispondendo alla domanda, ma affermando come jaxrs mi permetta di usare frequentemente PUT senza corpo:

Esempio di put senza corpo: concedi all'utente un'autorizzazione aggiuntiva.

PUT / admin / users / {nomeutente} / permission / {permission}


2
Esattamente il mio problema! Sono giunto alla stessa conclusione. Ma in senso stretto, questo va contro RFC, dove, sebbene non esplicitamente menzionato, il corpo è indicato come esistente. Potrebbe causare problemi, ma nella mia esperienza, tutti i moderni server / framework web funzionerebbero.
Agoston Horvath

In un caso simile, ho bisogno di un'API per associare una risorsa esistente a un utente. Potrei usare un POST users /: userId / resources con resourceId nel corpo. O meglio si adatterebbe a un PUT users /: userid / resources /: resourceId. La grande differenza qui è che la prima API dovrebbe essere non idempotente, quindi potrei associare la stessa risorsa a un utente due volte. la convocazione del PUT dovrebbe resettare l'associazione precedente
Carmine Ingaldi

5

Un corpo non è richiesto dallo standard IETF, sebbene la lunghezza del contenuto dovrebbe essere 0 se non è presente un corpo. Usa il metodo appropriato per quello che stai facendo. Se dovessi metterlo in codice, dato

int x;
int f(){ return x; }

e una variabile remota chiamata r.

Un post è equivalente a

r=f();

Un put è equivalente a

r=x;

e un get è equivalente a

x=r;

1
Questo è l'esempio più chiaro di PUT vs POST che abbia mai letto, anche se fuori tema
illusione digitale

Se la richiesta ha un'intestazione Content-Length, ha un corpo. Può essere un corpo vuoto, ma pur sempre un corpo. A differenza di una richiesta senza intestazione Content-Length, che non ha alcun corpo, nemmeno uno vuoto. Quindi sì, una richiesta PUT, tecnicamente, rigorosamente, deve avere un corpo. Sempre.
Paul Groke

Anche la tua analogia con il POST mi confonde completamente. Se provo a rimanere con il resto della tua analogia, dovrebbe essere più come se il server avesse un int f(int* resource, int body);e poi il POST avrebbe richiamato f(&r, x);- il che può fare o meno rquello che il server ritiene appropriato. Ma può anche restituire roba, quindi ... forse più simile y = f(&r, x);.
Paul Groke,

0

Cosa viene MESSO (nel senso verbale) sul server se non c'è contenuto? La specifica fa riferimento al contenuto come "l'entità racchiusa", ma una richiesta senza contenuto non avrebbe alcuna entità racchiusa e quindi nulla da mettere sul server.

A meno che, ovviamente, tu non voglia Mettere nulla sul server, nel qual caso probabilmente vorrai invece un DELETE.


1
quale potrebbe essere il tuo inserimento URL codificato piuttosto che nel corpo
MikeT

1
PUT empty sta solo dichiarando che la risorsa con una determinata identità deve esistere sul server sebbene non abbia contenuto oltre all'identità stessa. Questa è una semantica completamente diversa da DELETE.
Imre Pühvel

Immagina di voler inserire una risorsa ma di accettare tutte le impostazioni predefinite lato server. Sarebbe Content-Length: 0o { }in JSON come corpo?
Luke Puplett

1
Quindi non hai un singolo file vuoto sul tuo computer, vero?
Константин Ван

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.