什么是HTTP实体?
请有人请介绍一下HTTP实体究竟是什么?
我正在阅读HTTPClient文档,但我不明白这是什么意思?
HTTP实体是HTTP请求或响应的主要部分 ,由一些头部和主体(如果存在)组成。 它似乎是没有请求或状态行的整个请求或响应(尽pipe只有某些标题字段被认为是实体的一部分 )。
为了显示; 这是一个请求:
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.您正在一个请求中上传3个文件。 这3个文件是3个实体。 他们每个人都有自己的Content-Type
来表明它是什么types的文件。
案例2.您正在查看网页。 浏览器在后台下载了一个html文件作为实体。 由于页面可以不断更新,因此以后可能会得到完全不同的实体。
情况3.你有一个304 Not Modified
。 没有实体被转移。
总之, Entity是一个http消息 (请求或响应)中可选的有效载荷 ,所以它是Entity和Message之间的“ 部分 – 整体 ”关系。
一些头域适用于类似Transfer-Encoding
消息,描述了如何在中介之间传递消息,因此可以被请求/响应链( hop-by-hop headers
)上的任何应用程序添加或删除。 相比之下,那些适用于Entity
头域是一些属性,它们描述了实体的大小,types,压缩algorithm等等。
进一步阅读,从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
可能是“分块”,这意味着如何传输消息, Content-Encoding
可能是“gzip”,代表如何压缩实体。
它是表示请求或响应有效载荷的抽象 。 JavaDoc明确了其目的和各种实体types。
我猜HTTPClient Entity
是根据HTTP 实体命名的。
HTTP是通过networking从远程机器访问信息时观察到的协议。 通常networking是互联网,远程机器是服务器。
当你向A人询问信息时,你给他一个信息。 (请求)。 人B回复你(回应)。 请求和响应是HTTP消息types。
A人可以要求B人做一些事情,而不是要求提供信息。 说,人A想要人B将文件存储在安全的位置。 所以,人A将该文件(HTTP实体)传递给人B,并要求他做一些事情(HTTP消息)。 在这种情况下,Person正在传递一个“Entity”。 在HTTP实体的上下文中,它是与消息相关的有效载荷。
希望类比帮助。
正如@ hawkeye-parker在评论中所说的那样,Entity已经被弃用了。 在2014年rfcsearch ,你会看到关于XML实体和消息体,但没有关于Http实体。
不过,HttpClient,还有JaxRS客户端,都有一个setEntity()
和getEntity()
方法。
考虑到接受的答案,两个图书馆都是错误的! HttpClient.setEntity()
不会删除以前设置的标题。
实体就像是一个消息,它由头,元数据,如位置,郎,编码…
可选的身体 – 它的内容是格式化的,如标题中指定的