HTTP实体到底是什么?


114

有人可以告诉我一个HTTP实体到底是什么吗?

我正在阅读HTTPClient文档,但是我真的不明白那是什么意思?


2
我来自HTTP上的这篇文章:HTTP:每个Web开发人员都必须知道的协议,如果其他任何人都来这里寻找有关该主题的信息。
Mason240

2
请注意,术语“ HTTP实体”不再出现在最新的HTTP 1.1规范中。看起来已经过时了。现在,我们可以只使用“标题字段”和“消息正文”。
Hawkeye Parker

Answers:


139

一个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
主机不是实体标头字段。
Gumbo

我认为实体正在使用&而不是&。那不是实体吗?有什么不同?
CodyBugstein

1
@Imray:&HTML字符实体引用,而不是HTTP Entity
maerics 2013年

2
@lmray:它们是完全不同的实体。;)(一种方法是在HTML文本中编码字符串,另一种方法是关于当浏览器和服务器通过HTTP协议相互通信时结构化信息。另外,一种方法比另一种方法更令人困惑,反之亦然。;- o)
Sz。

6
请注意,术语“ HTTP实体”不再出现在最新的HTTP 1.1规范中。看起来已经过时了。现在我们可以坚持使用“标题字段”和“消息正文”。
Hawkeye Parker

15

这是3种简单情况:

情况1。您在一个请求中上传了3个文件。这3个文件是3个实体。他们每个人都有自己Content-Type的指示文件的类型。

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

情况3。 304 Not Modified。尚未转移任何实体。

简而言之,Entity是http消息(请求或响应)中的可选有效负载,因此它是“ 部分整体” Entity与Message之间 ”关系。

一些头字段适用于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-body = Transfer-Encoding( Content-Encoding(entity-body) )

其中的Transfer-Encoding“分块”表示如何传输消息,Content-Encoding“ gzip”则表示如何压缩实体。


哇,感谢您阐明实体与消息之间的“整体”关系!其余的有点增加了混乱,但是总的来说,仍然值得赞扬。干杯!
Sz。

12

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


3
+1称为“有效负载”,最终为该无效术语(“实体”)添加了一些含义。
Sz。


2

HTTP是一种协议,当通过网络从远程计算机访问信息时,会遵守该协议。通常,网络是Internet,而远程计算机是服务器。

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

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

希望这个比喻有所帮助。


2

正如@ hawkeye-parker在评论中所说,实体似乎已被弃用。在此2014 rfc中进行搜索,您将看到有关XML实体和消息正文的信息,但没有看到有关Http实体的信息。

不过,HttpClient和JaxRS客户端也都有setEntity()getEntity()方法。

考虑到已接受的答案,两个库都是错误的!HttpClient.setEntity()不会删除先前设置的标题。


我发现区分“实体”(和相关的“实体标题”)和“消息”非常有用。当您设计网络库并分析HTTP消息及其各种形式(例如,多部分消息)时,这一点很快变得很明显。不幸的是,新的RFC将这些不同的“类”合并为一个,我们需要引入自己的术语,或者坚持使用“实体”。
CouchDeveloper

1

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

0

实体就像一条消息,它由标头组成,其中包含元数据,例如位置,语言,编码...

以及可选的主体-它的内容按照标题中指定的格式进行格式化


0

在我们这里所提供的良好答案中,我认为值得一提的是直接来自RFC 2616(超文本传输​​协议-HTTP / 1.1)的内容

实体

如果请求和响应消息不受请求方法或响应状态代码的限制,则请求和响应消息可以传输实体。实体由实体标题字段和实体实体组成,尽管某些响应仅包括实体标题。

简而言之:实体可以转让,也可以是标头 + 正文,也可以只是标头

既然有上面的链接,我将继续发表其他评论。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.