什么是HTTP实体?

时间:2012-02-08 16:48:29

标签: http httpclient

有人请向我描述一下 HTTP实体究竟是什么?

我正在阅读HTTPClient文档,但我真的不明白这意味着什么?

9 个答案:

答案 0 :(得分:125)

HTTP entity是HTTP请求或响应的主要部分,由some of the headers和正文(如果存在)组成。它似乎是没有请求或状态行的整个请求或响应(尽管只有certain header fields are considered part of the entity)。

说明;这是一个请求:

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! ...           # ┘

并回复:

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 ...           # ┘

答案 1 :(得分:14)

以下是3个简单案例:

案例1.您在一个请求中上传了3个文件。这3个文件是3个实体。他们每个人都有自己的Content-Type来表明它是什么类型的文件。

案例2.您正在查看网页。浏览器在后台下载了一个html文件作为实体。由于页面可以不断更新,因此您可能会在以后获得完全不同的实体。

案例3.你有一个304 Not Modified。没有实体被转移。

总之,实体是http消息中的可选有效负载(请求或响应),因此它是实体和实体之间的“部分 - 整体”关系消息。

某些标题字段适用于Message,如Transfer-Encoding描述如何在中介之间传递消息,因此可以由请求/响应链中的任何应用程序添加或删除(hop-by-hop headers) 。相比之下,那些应用于Entity的头字段是一些属性,它们描述了实体的大小,类型,压缩算法等......

进一步阅读,引用RFC 2616第1.4,4.5和4.3节:

  • 请求/响应链
     request chain -------------------------------------->
   UA -----v----- A -----v----- B -----v----- C -----v----- O
      <------------------------------------- response chain
     

上图显示了用户代理和源服务器之间的三个中介(A,B和C)。传递整个链的请求或响应消息将通过四个单独的连接。

  • 消息或实体的标头字段
  

有一些标题字段对请求和响应消息具有普遍适用性,但不适用于正在传输的实体。这些标题字段仅适用于正在传输的邮件

  • Message的标题字段可以在链中更改
  

传输编码必须用于指示应用程序应用的任何传输编码,以确保安全和正确地传输消息。 Transfer-Encoding是消息的属性,而不是实体的属性,因此可以由请求/响应链中的任何应用程序添加或删除。

  • 邮件正文与实体正文之间的关系

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

其中Transfer-Encoding可能是“chunked”,这意味着如何传输邮件,而Content-Encoding可能是“gzip”,代表如何压缩实体。

答案 2 :(得分:12)

抽象表示请求或响应有效负载JavaDoc明确其目的和各种实体类型。

答案 3 :(得分:6)

我想HTTPClient Entity是根据HTTP Entity命名的。

答案 4 :(得分:2)

如@ hawkeye-parker的评论中所述,看起来Entity已被弃用。创建一个search in this 2014 rfc,您将看到有关XML实体和消息正文的内容,但没有关于Http实体的内容。

然而,HttpClient,以及JaxRS客户端,都有setEntity()getEntity()方法。

考虑到接受的答案,两个库都错了! HttpClient.setEntity()无法删除以前设置的标头。

答案 5 :(得分:2)

HTTP是在通过网络从远程计算机访问信息时观察到的协议。通常网络是互联网,远程机器是服务器。

当您要求从A人到B人的信息时,您会给他一条消息。 (请求)。 B人回复你(回复)。请求和响应是HTTP消息类型。

A人可以要求B人做某事,而不是要求提供信息。比如说,人员A希望人员B将文件存储在安全的位置。因此,Person A将该文件(HTTP实体)传递给Person B并要求他做某事(HTTP消息)。在这种情况下,Person正在传递&#34;实体&#34;。在HTTP实体的上下文中,它是与消息附加的有效负载。

希望这个比喻有所帮助。

答案 6 :(得分:0)

实体就像一条消息,它由标题组成,其中包含元数据,例如location,lang,encoding ......

可选的正文 - 内容按照标题

中的指定格式化

答案 7 :(得分:0)

HttpEntity是您将在Request(带有标头)中传递的内容以及您在Response中获得的内容。 对于Get Request,我们传递了简单的String

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

对于邮政,我们将通过完整的实体类

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();
}

答案 8 :(得分:0)

最新的HTTP 1.1 RFC 7230使用术语“有效负载”代替“实体”。一些旧文档仍然在引用旧术语。

关于实体(有效负载)要记住的重要实际事情是:

如果不存在Transfer-Encoding,则消息正文=实体(有效载荷)正文。

如果存在Transfer-Encoding,则必须通过适当的解码和提取来获得Entity(Payload)Body。