有人可以告诉我一个HTTP实体到底是什么吗?
我正在阅读HTTPClient文档,但是我真的不明白那是什么意思?
有人可以告诉我一个HTTP实体到底是什么吗?
我正在阅读HTTPClient文档,但是我真的不明白那是什么意思?
Answers:
一个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 ... # ┘
&
而不是&
。那不是实体吗?有什么不同?
&
是HTML字符实体引用,而不是HTTP Entity。
这是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”则表示如何压缩实体。
正如@ hawkeye-parker在评论中所说,实体似乎已被弃用。在此2014 rfc中进行搜索,您将看到有关XML实体和消息正文的信息,但没有看到有关Http实体的信息。
不过,HttpClient和JaxRS客户端也都有setEntity()
和getEntity()
方法。
考虑到已接受的答案,两个库都是错误的!HttpClient.setEntity()
不会删除先前设置的标题。
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();
}
实体就像一条消息,它由标头组成,其中包含元数据,例如位置,语言,编码...
以及可选的主体-它的内容按照标题中指定的格式进行格式化
在我们这里所提供的良好答案中,我认为值得一提的是直接来自RFC 2616(超文本传输协议-HTTP / 1.1)的内容:
实体
如果请求和响应消息不受请求方法或响应状态代码的限制,则请求和响应消息可以传输实体。实体由实体标题字段和实体实体组成,尽管某些响应仅包括实体标题。
简而言之:实体可以转让,也可以是标头 + 正文,也可以只是标头。
既然有上面的链接,我将继续发表其他评论。