HTTP 实体到底是什么?

谁能告诉我 HTTP 实体到底是什么?

I am reading the HTTPClient documentation, but I do not really understand what that means?

87137 次浏览

我想 HTTPClientEntity是根据 HTTP实体命名的。

实体类似于消息,它由头部组成,其中有元数据,如位置、朗、编码..。

以及可选的主体-它的内容是格式化等指定的标题

它是一个 抽象表示请求或响应 payloadJavaDoc的目的和各种实体类型是明确的。

HTTP 实体是 HTTP 请求或响应的大部分,如果存在的话,它由 一些标题和正文组成。它似乎是没有请求或状态行(尽管只有 某些头字段被认为是实体的一部分)的整个请求或响应。

举个例子,我有个请求:

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

这里有3个简单的例子:

案例1。你在一次请求中上传了3个文件。这三个文件是三个实体。每个文件都有自己的 Content-Type来指示它是什么类型的文件。

案例2。你在浏览一个网页。Browser 在后台下载了一个 html 文件作为实体。由于页面可以不断更新,所以以后可能会得到完全不同的实体。

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

一句话,Entity is an optional payload inside an http message(请求或响应) ,所以它是实体和消息之间的“ 部分完整”关系。

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

Further reading, quoting from RFC 2616 section 1.4, 4.5 and 4.3:

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

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

  • 邮件或实体的头字段

有几个头字段对请求和响应消息都具有普遍适用性,但是它们不适用于 被转移的实体。这些头字段仅适用于 正在传送的信息

  • 消息的头字段可以沿着链进行更改

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

  • 消息体与实体体的关系

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

其中 Transfer-Encoding可能是“块”,这意味着如何传输消息,而 Content-Encoding可能是“ gzip”,表示如何压缩实体。

正如@hawkeye-parker 在一条评论中所说,似乎 Entity 已被弃用。创建一个 搜索在这2014年的 rfc,您将看到关于 XML 实体和消息体的内容,但不会看到关于 Http 实体的内容。

尽管如此,HttpClient 和 JaxRS 客户机都有一个 setEntity()getEntity()方法。

考虑到已接受的答案,这两个库都错了! HttpClient.setEntity()不会删除以前设置的头文件。

HTTP 是一种协议,当通过网络从远程计算机访问信息时,可以观察到这种协议。通常网络是互联网,远程机器是服务器。

当你向 A 询问 B 的信息时,你要给他一个信息。(要求)。B 回复你(回应)。请求和响应是 HTTP 消息类型。

A 可以要求 B 做某事,而不是询问信息。假设 A 希望 B 将文件存储在一个安全的位置。因此,个人 A 将该文件(HTTP 实体)传递给个人 B,并要求他做一些事情(HTTP 消息)。在本例中,Person 正在传递一个“ Entity”。在 HTTP 实体的上下文中,它是与消息一起附加的有效负载。

希望这个比喻有帮助。

在我们这里得到的好答案中,我认为值得一提的是直接来自 Rfc2616(超文本传输协议-HTTP/1.1)的一些东西:

实体

请求和响应消息可能传输一个实体,如果没有其他 受到请求方法或响应状态代码的限制。 实体 包含实体头字段和实体主体的 ,尽管有一些 回应将只包括实体标题。

简而言之: 可以转移一个实体,它可以是 header + body,也可以只是 header

既然有上面的链接,我就不再多说了。

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

最新的 HTTP 1.1 RFC 7230使用了术语 Payload 而不是 Entity。一些旧的文档仍然在引用旧的术语。

关于实体(有效载荷)需要记住的重要实际问题是:

如果传输编码不存在,则消息体 = 实体(有效载荷)体。

如果传输编码存在,实体(有效载荷)体必须通过适当的解码和提取获得。