Alguém poderia me descrever o que exatamente é uma entidade HTTP ?
Estou lendo a documentação do HTTPClient, mas não entendo realmente o que isso significa.
Alguém poderia me descrever o que exatamente é uma entidade HTTP ?
Estou lendo a documentação do HTTPClient, mas não entendo realmente o que isso significa.
Respostas:
Uma entidade HTTP é a maior parte de uma solicitação ou resposta HTTP, consistindo em alguns dos cabeçalhos e no corpo, se houver. Parece ser a solicitação ou resposta inteira sem a linha de solicitação ou status (embora apenas alguns campos de cabeçalho sejam considerados parte da entidade ).
Ilustrar; aqui está um pedido:
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! ... # ┘
E uma resposta:
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 ... # ┘
&
vez de &
. Não é uma entidade também? Qual é a diferença?
Aqui estão 3 casos simples:
Caso 1. Você está enviando 3 arquivos em uma única solicitação. Esses 3 arquivos são 3 entidades. Cada um deles tem seu próprio Content-Type
para indicar que tipo de arquivo é.
Caso 2. Você está visualizando uma página da web. O navegador baixou um arquivo html como entidade em segundo plano. Como a página pode ser atualizada continuamente, você pode obter uma entidade totalmente diferente mais tarde.
Caso 3. Você tem um 304 Not Modified
. Nenhuma entidade foi transferida.
Em uma palavra, Entidade é uma carga útil opcional dentro de uma mensagem http (solicitação ou resposta), portanto, é uma relação " parte-todo " entre Entidade e Mensagem.
Alguns campos de cabeçalho para aplicar Message
como Transfer-Encoding
descrevem como para transferir mensagens entre intermediários, e, portanto, pode ser adicionado ou removido por qualquer aplicação ao longo da cadeia de pedido / resposta ( hop-by-hop headers
). Em comparação, esses campos de cabeçalho se aplicam a Entity
algumas propriedades, que descrevem o tamanho da entidade, tipo, algoritmo de compressão, etc ...
Leitura adicional, citando RFC 2616 seção 1.4, 4.5 e 4.3:
request chain --------------------------------------> UA -----v----- A -----v----- B -----v----- C -----v----- O <------------------------------------- response chain
A figura acima mostra três intermediários (A, B e C) entre o agente do usuário e o servidor de origem. Uma mensagem de solicitação ou resposta que percorre toda a cadeia passará por quatro conexões separadas.
Existem alguns campos de cabeçalho que têm aplicabilidade geral para mensagens de solicitação e resposta, mas que não se aplicam à entidade que está sendo transferida . Esses campos de cabeçalho se aplicam apenas à mensagem que está sendo transmitida .
A codificação de transferência DEVE ser usada para indicar qualquer codificação de transferência aplicada por um aplicativo para garantir a transferência correta e segura da mensagem. Transfer-Encoding é uma propriedade da mensagem, não da entidade e, portanto, PODE ser adicionada ou removida por qualquer aplicativo ao longo da cadeia de solicitação / resposta.
message-body = Transfer-Encoding( Content-Encoding(entity-body) )
onde Transfer-Encoding
pode ser "fragmentado", que significa como transferir a mensagem, e Content-Encoding
pode ser "gzip" que significa como compactar a entidade.
HTTP é um protocolo observado ao acessar informações de uma máquina remota por meio de uma rede. Normalmente a rede é a Internet e a máquina remota é um servidor.
Quando você pede informações da pessoa A para a pessoa B, você envia uma mensagem a ela. (Solicitação). A pessoa B responde para você (resposta). Solicitação e resposta são tipos de mensagens HTTP.
A pessoa A pode pedir à pessoa B para fazer algo, em vez de pedir informações. Digamos que a pessoa A deseja que a pessoa B armazene um arquivo em um local seguro. Então, a Pessoa A passa esse arquivo (Entidade HTTP) para a Pessoa B e pede a ela para fazer algo (Mensagem HTTP). Nesse caso, Pessoa está passando uma "Entidade". No contexto da Entidade HTTP, é uma carga anexada à mensagem.
Espero que a analogia tenha ajudado.
Como disse em um comentário de @ hawkeye-parker, parece que o Entity foi preterido. Faça uma pesquisa neste rfc de 2014 e você verá sobre entidades XML e corpo de mensagem, mas nada sobre entidade Http.
No entanto, o HttpClient, mas também o cliente JaxRS, têm um método setEntity()
e getEntity()
.
Considerando a resposta aceita, ambas as bibliotecas estão erradas! HttpClient.setEntity()
não removerá cabeçalhos configurados anteriormente.
HttpEntity
é o que você vai passar em Request (com cabeçalho) e o que vai receber em Response. Para Get Request, estamos passando uma string simples
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity<String> entity = new HttpEntity<String>(headers);
Para Post, vamos passar na Classe de Entidade 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();
}
Entidade é algo como uma mensagem, consiste em um cabeçalho, onde estão os metadados como localização, idioma, codificação ...
E, opcionalmente, de um corpo - o conteúdo é formatado etc. conforme especificado no cabeçalho
Entre as boas respostas que temos aqui, creio que vale a pena citar algo que vem diretamente do RFC 2616 (Hypertext Transfer Protocol - HTTP / 1.1) :
Entidade
As mensagens de solicitação e resposta PODEM transferir uma entidade, se não houver restrição pelo método de solicitação ou código de status de resposta. Uma entidade consiste em campos de cabeçalho de entidade e um corpo de entidade, embora algumas respostas incluam apenas os cabeçalhos de entidade.
Resumindo: uma Entidade pode ser transferida, e pode ser o cabeçalho + corpo ou apenas o cabeçalho .
Como existe o link acima, me detenho em fazer comentários adicionais.