2009-08-05 21 views
54

Tengo problemas para encontrar una especificación definitiva de esto en el estándar. Tengo un cliente HTTP que no incluye un encabezado 'Content-Length: 0' al hacer una solicitud PUT donde no especifico un cuerpo, y un servidor que se confunde con tales solicitudes, y me pregunto qué programa debería culpar¿Se requiere una solicitud HTTP PUT para incluir un cuerpo?

Respuesta

46

Las solicitudes HTTP tienen un cuerpo si tienen un encabezado Content-Length o Transfer-Encoding (RFC 2616 4.3). Si la solicitud no tiene ninguno, no tiene cuerpo y su servidor debería tratarlo como tal.

Dicho esto, es inusual que una solicitud PUT no tenga cuerpo, por lo que si estuviera diseñando un cliente que realmente quisiera enviar un cuerpo vacío, pasaría Content-Length: 0. De hecho, dependiendo de la propia al leer las definiciones de los métodos POST y PUT (RFC 2616 9.5, 9.6) se podría argumentar que se requiere que el cuerpo sea requerido, pero una forma razonable de no manejar ningún cuerpo sería asumir un cuerpo de longitud cero.

2

Lo que se está poniendo (en el sentido verbo) en el servidor si no hay contenido? El spec se refiere al contenido como "la entidad adjunta", pero una solicitud sin contenido no tendría entidad incluida y, por lo tanto, nada para poner en el servidor.

A menos que, por supuesto, no quisiera PONER nada en el servidor, en cuyo caso probablemente prefiera un BORRAR.

34

no responder a la pregunta, pero la afirmación de cómo jaxrs me permite el uso frecuente de PUT sin cuerpo:

Ejemplo de poner bodyless: Dale usuario un permiso adicional.

PUT/admin/usuarios/{nombre de usuario}/permiso/autorización} {

+1

exactamente mi ¡problema! Llegué a la misma conclusión. Pero hablando estrictamente, esto va en contra de RFC, donde, aunque no se menciona explícitamente, se hace referencia al cuerpo como existente. Podría causar problemas, pero en mi experiencia, todos los servidores/frameworks web modernos funcionarían. –

1

Un cuerpo no es requerido por el estándar IETF, aunque el contenido de longitud debe ser 0 si no hay cuerpo. Usa el método apropiado para lo que estás haciendo. Si se va a poner en código, dado

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

y una variable llamada remota r.

Un post es equivalente a

r=f(); 

Una opción de venta es equivalente a

r=x; 

y una get es equivalente a

x=r; 
+0

Este es el ejemplo más claro de PUT vs POST que he leído, aunque fuera del tema –

Cuestiones relacionadas