有人请向我描述一下 HTTP实体究竟是什么?
我正在阅读HTTPClient文档,但我真的不明白这意味着什么?
答案 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)。传递整个链的请求或响应消息将通过四个单独的连接。
有一些标题字段对请求和响应消息具有普遍适用性,但不适用于正在传输的实体。这些标题字段仅适用于正在传输的邮件。
传输编码必须用于指示应用程序应用的任何传输编码,以确保安全和正确地传输消息。 Transfer-Encoding是消息的属性,而不是实体的属性,因此可以由请求/响应链中的任何应用程序添加或删除。
message-body = Transfer-Encoding( Content-Encoding(entity-body) )
其中Transfer-Encoding
可能是“chunked”,这意味着如何传输邮件,而Content-Encoding
可能是“gzip”,代表如何压缩实体。
答案 2 :(得分:12)
抽象表示请求或响应有效负载。 JavaDoc明确其目的和各种实体类型。
答案 3 :(得分:6)
答案 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。