¿Qué es exactamente una entidad HTTP?


114

¿Alguien podría describirme qué es exactamente una entidad HTTP ?

Estoy leyendo la documentación de HTTPClient, pero realmente no entiendo lo que eso significa.


2
Vine aquí desde este artículo escrito sobre HTTP: HTTP: El protocolo que todo desarrollador web debe conocer si alguien más pasa por aquí en busca de información sobre el tema.
Mason240

2
Tenga en cuenta que el término "entidad HTTP" ya no aparece en las últimas especificaciones HTTP 1.1 . Parece que ha quedado obsoleto. Ahora solo podemos usar "campos de encabezado" y "cuerpo del mensaje".
Hawkeye Parker

Respuestas:


139

Una entidad HTTP es la mayor parte de una solicitud o respuesta HTTP, que consta de algunos de los encabezados y el cuerpo, si está presente. Parece ser la solicitud o respuesta completa sin la solicitud o la línea de estado (aunque solo ciertos campos de encabezado se consideran parte de la entidad ).

Para ilustrar; aquí hay una solicitud:

POST /foo HTTP/1.1          # Not part of the entity.
Content-Type: text/plain    # ┬ The entity is from this line down...
Content-Length: 1234        # │
                            # │
Hello, World! ...           # ┘

Y una respuesta:

HTTP/1.1 200 OK             # Not part of the entity.
Content-Length: 438         # ┬ The entity is from this line down...
Content-Type: text/plain    # │
                            # │
Response body ...           # ┘

3
El host no es un campo de encabezado de entidad.
Gumbo

Pensé que una entidad estaba usando en &lugar de &. ¿No es eso también una entidad? ¿Cual es la diferencia?
CodyBugstein

1
@Imray: &es una referencia de entidad de carácter HTML , no es lo mismo que una entidad HTTP .
maerics

2
@lmray: son entidades completamente diferentes. ;) (Uno trata sobre la codificación de cadenas en un texto HTML , el otro trata sobre la estructuración de información cuando un navegador y un servidor se comunican entre sí a través del protocolo HTTP . Además, uno es más confuso que el otro. O viceversa.; - o)
Sz.

6
Tenga en cuenta que el término "entidad HTTP" ya no aparece en las últimas especificaciones HTTP 1.1 . Parece que ha quedado obsoleto. Ahora podemos quedarnos con "campos de encabezado" y "cuerpo del mensaje".
Hawkeye Parker

15

Aquí hay 3 casos simples:

Caso 1. Estás cargando 3 archivos en una sola solicitud. Esos 3 archivos son 3 entidades. Cada uno tiene el suyo Content-Typepara indicar qué tipo de archivo es.

Caso 2. Estás viendo una página web. El navegador ha descargado un archivo html como entidad en segundo plano. Dado que la página se puede actualizar continuamente, es posible que obtenga una entidad totalmente diferente más adelante.

Caso 3. Tienes un 304 Not Modified. No se ha transferido ninguna entidad.

En una palabra, la entidad es una carga útil opcional dentro de un mensaje http (ya sea una solicitud o una respuesta), por lo que es una relación " parte-todo " entre la entidad y el mensaje.

Algunos campos de cabecera se aplican a Messagegustaría Transfer-Encodingdescribir la forma de transferencia de mensajes entre los intermediarios, y por lo tanto puede ser añadido o retirado por cualquier aplicación a lo largo de la cadena de petición / respuesta ( hop-by-hop headers). En comparación, esos campos de encabezado se aplican a Entityalgunas propiedades, que describen el tamaño de la entidad, el tipo, el algoritmo de compresión, etc.

Lectura adicional, citando de RFC 2616 sección 1.4, 4.5 y 4.3:

  • Una cadena de solicitud / respuesta
     request chain -------------------------------------->
   UA -----v----- A -----v----- B -----v----- C -----v----- O
      <------------------------------------- response chain

La figura anterior muestra tres intermediarios (A, B y C) entre el agente de usuario y el servidor de origen. Un mensaje de solicitud o respuesta que recorra toda la cadena pasará a través de cuatro conexiones independientes.

  • Campos de encabezado para Mensaje o Entidad

Hay algunos campos de encabezado que tienen aplicabilidad general tanto para mensajes de solicitud como de respuesta, pero que no se aplican a la entidad que se transfiere . Estos campos de encabezado se aplican solo al mensaje que se transmite .

  • Los campos de encabezado para el mensaje se pueden cambiar a lo largo de la cadena

La codificación de transferencia DEBE utilizarse para indicar cualquier codificación de transferencia aplicada por una aplicación para garantizar la transferencia segura y adecuada del mensaje. Transfer-Encoding es una propiedad del mensaje, no de la entidad, y por lo tanto PUEDE ser agregada o eliminada por cualquier aplicación a lo largo de la cadena de solicitud / respuesta.

  • Relación entre el cuerpo del mensaje y el cuerpo de la entidad

message-body = Transfer-Encoding( Content-Encoding(entity-body) )

where Transfer-Encodingpuede estar "fragmentado", que significa cómo transferir el mensaje, y Content-Encodingpuede ser "gzip", que significa cómo comprimir la entidad.


¡Vaya, gracias por aclarar la relación "parte-todo" entre entidad y mensaje! El resto se suma un poco a la confusión, pero en general, aún vale la pena un voto positivo. ¡Salud!
Sz.

12

Es una abstracción que representa una carga útil de solicitud o respuesta . El JavaDoc es claro sobre su propósito y varios tipos de entidades.


3
+1 por llamarlo "carga útil", que finalmente agrega algún significado a ese término vacío ("entidad").
Sz.


2

HTTP es un protocolo que se observa cuando se accede a información desde una máquina remota a través de una red. Por lo general, la red es Internet y la máquina remota es un servidor.

Cuando pides información de la persona A a la persona B, le das un mensaje. (Solicitud). La persona B le responde (Respuesta). La solicitud y la respuesta son tipos de mensajes HTTP.

La persona A puede pedirle a la persona B que haga algo, en lugar de pedir información. Digamos que la persona A quiere que la persona B almacene un archivo en un lugar seguro. Entonces, la Persona A pasa ese archivo (Entidad HTTP) a la Persona B y le pide que haga algo (Mensaje HTTP). En este caso, Person pasa una "Entidad". En el contexto de la entidad HTTP, es una carga útil adjunta al mensaje.

Espero que la analogía ayude.


2

Como se dijo en un comentario de @ hawkeye-parker, parece que Entity ha quedado obsoleto. Realice una búsqueda en este rfc de 2014 y verá sobre las entidades XML y el cuerpo del mensaje, pero nada sobre la entidad Http.

Sin embargo, HttpClient, pero también el cliente JaxRS, tienen una setEntity()ygetEntity() método .

Teniendo en cuenta la respuesta aceptada, ¡ambas bibliotecas están equivocadas! HttpClient.setEntity()no eliminará los encabezados establecidos previamente.


Encontré la distinción de "Entidad" (y "encabezados de entidad" relacionados) y "Mensaje" bastante útil. Esto se hace evidente rápidamente cuando diseña una biblioteca de red y realiza un análisis de un mensaje HTTP y sus diversas encarnaciones, por ejemplo, un mensaje de varias partes. Desafortunadamente, las nuevas RFC fusionan estas "clases" distintas en una y necesitamos introducir nuestra propia terminología, o seguir con "Entidad".
CouchDeveloper

1

HttpEntityes lo que va a pasar en Solicitud (con encabezado) y lo que obtiene en Respuesta. Para Get Request, estamos pasando una cadena simple

 HttpHeaders headers = new HttpHeaders();
 headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
 HttpEntity<String> entity = new HttpEntity<String>(headers);

Para la publicación, vamos a aprobar la clase de entidad completa.

public String createProducts(@RequestBody Product product) {
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    HttpEntity<Product> entity = new HttpEntity<Product>(product,headers);

    return restTemplate.exchange(
             "http://localhost:8080/products", HttpMethod.POST, entity, String.class
           ).getBody();
}

0

La entidad es algo así como un mensaje, consta de un encabezado, donde están los metadatos como ubicación, idioma, codificación ...

Y, opcionalmente, de un cuerpo: su contenido está formateado, etc., como se especifica en el encabezado


0

Entre las buenas respuestas que tenemos aquí, creo que vale la pena mencionar algo que viene directamente del RFC 2616 (Hypertext Transfer Protocol - HTTP / 1.1) :

Entidad

Los mensajes de solicitud y respuesta PUEDEN transferir una entidad si no están restringidos por el método de solicitud o el código de estado de respuesta. Una entidad consta de campos de encabezado de entidad y un cuerpo de entidad, aunque algunas respuestas solo incluirán los encabezados de entidad.

En pocas palabras: una entidad puede ser transferida, y puede ser el encabezado + cuerpo , o solo el encabezado .

Dado que está el enlace de arriba, me detengo en hacer comentarios adicionales.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.