2009-08-05 25 views
54

Non riesco a trovare una specifica precisa di questo nello standard. Ho un client HTTP che non include un'intestazione 'Content-Length: 0' quando faccio una richiesta PUT in cui non specifichi un corpo, e un server che viene confuso da tali richieste, e mi chiedo quale programma dovrei incolpare.È richiesta una richiesta PUT HTTP per includere un corpo?

risposta

46

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

Detto questo, è insolito che una richiesta PUT non abbia un corpo e quindi se stessimo progettando un client che desiderava veramente inviare un corpo vuoto, passerei Content-Length: 0. Infatti, a seconda della propria leggendo le definizioni dei metodi POST e PUT (RFC 2616 9.5, 9.6) si potrebbe sostenere che il corpo è implicito per essere richiesto - ma un modo ragionevole per gestire nessun corpo sarebbe quello di assumere un corpo a lunghezza zero.

2

ciò che viene PUT (nel senso del verbo) sul server se non c'è nessun contenuto? Lo spec si riferisce al contenuto come "l'entità inclusa", ma una richiesta senza contenuto non avrebbe un'entità inclusa e quindi nulla da mettere sul server.

A meno che, ovviamente, non voleste mettere nulla sul server, nel qual caso si preferirebbe invece un DELETE.

34

Non rispondere alla domanda, ma affermando come jaxrs mi permette di uso frequente di PUTs senza corpo:

Esempio di put senza corpo: dare all'utente un permesso supplementare.

PUT/admin/utenti/{username}/autorizzazione/{} permesso

+1

esattamente la mia problema! Sono arrivato alla stessa conclusione. Ma in senso stretto, questo va contro RFC, dove, anche se non menzionato esplicitamente, il corpo viene definito come esistente. Potrebbe causare problemi, ma secondo la mia esperienza, tutti i moderni server/framework web funzionerebbero. –

1

Un corpo non è richiesta dallo standard IETF, anche se il contenuto di lunghezza dovrebbe essere 0 se non c'è nessun corpo. Usa il metodo appropriato per quello che stai facendo. Se si dovesse mettere in codice, dato

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

e una variabile remota denominata r.

Un post equivale a

r=f(); 

Un put equivale a

r=x; 

e un get equivale a

x=r; 
+0

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

Problemi correlati