Tengo problemas para encontrar una especificación definida de esto en el estándar. Tengo un cliente HTTP que no incluye un Content-Length: 0encabezado cuando hago una solicitud PUT donde no especifico un cuerpo, y un servidor que se confunde con tales solicitudes, y me pregunto a qué programa debería culpar.
92

Respuestas:
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 debe 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 lectura de POST. y las definiciones del método PUT ( RFC 2616 9.5, 9.6 ) se podría argumentar que se implica que el cuerpo es obligatorio, pero una forma razonable de no manejar ningún cuerpo sería asumir un cuerpo de longitud cero.
fuente
PUTsolicitud es básicamente para crear o actualizar un archivo en el servidor. Y no hay nada ilegítimo en que un archivo esté vacío, ¿no?disableyenableson verbos. Probablemente preferiría usarloPATCHen el/users/{id}punto final en ese caso.Sin responder la pregunta, pero afirmando cómo jaxrs me permite el uso frecuente de PUT sin cuerpo:
Ejemplo de colocación sin cuerpo: otorgue al usuario un permiso adicional.
PUT / admin / users / {username} / permiso / {permiso}
fuente
El estándar IETF no requiere un cuerpo, aunque la longitud del contenido debe ser 0 si no hay cuerpo. Utilice el método que sea apropiado para lo que está haciendo. Si tuviera que ponerlo en código, dado
y una variable remota llamada
r.Una publicación es equivalente a
Un put es equivalente a
y un get es equivalente a
fuente
int f(int* resource, int body);y luego se invocaría POST, lof(&r, x);que puede hacer o no hacerrlo que el servidor considere apropiado. Pero también puede devolver cosas, así que ... tal vez más comoy = f(&r, x);.¿Qué se PUT (en el sentido verbal) en el servidor si no hay contenido? La especificación se refiere al contenido como "la entidad adjunta", pero una solicitud sin contenido no tendría una entidad adjunta y, por lo tanto, nada para poner en el servidor.
A menos que, por supuesto, no desee PONER nada en el servidor, en cuyo caso probablemente desee un DELETE en su lugar.
fuente
Content-Length: 0o{ }en JSON como el cuerpo?El campo de longitud del contenido es obligatorio según la siguiente sección del estándar HTTP / 1.1 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13
fuente