我正在尝试使用Jersey从Java应用程序向Tomcat服务器发送gzip
ed multipart POST
。当多部分请求未被压缩时,它完全正常。其他类型的压缩POSTS工作正常,例如发送单个实体XML。我(相信)发布压缩数据不是HTTP标准,但似乎Tomcat在某种程度上支持它。
工作未压缩的多部分帖子:
POST /myApp/rest/data HTTP/1.1
Content-Type: multipart/mixed; boundary=Boundary_1_23237284_1331130438482
Cookie: JSESSIONID=XXXXXXXXXXXXXXXXXXXXXXXXX;Version=1;Path=/myApp/
MIME-Version: 1.0
User-Agent: Java/1.6.0_26
Host: localhost:8080
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
Transfer-Encoding: chunked
d3
--Boundary_1_23237284_1331130438482
Content-Type: application/octet-stream
Content-Disposition: form-data; filename="uploadFile.war"; modification-date="Wed, 29 Feb 2012 18:01:38 GMT"; size=25343899; name="file"
{binary data here}
--Boundary_1_25179713_1331128929019
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><myXMLEntity>stuff</myXMLEntity>
--Boundary_1_25179713_1331128929019--
当我使用Jersey GZIPContentEncodingFilter()
压缩它时,会发送以下标题,然后我返回一个带有“语法不正确”描述的HTTP 400
POST /myApp/rest/data HTTP/1.1
Content-Type: multipart/mixed
Cookie: JSESSIONID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;Version=1;Path=/myApp/
Accept-Encoding: gzip
Content-Encoding: gzip
User-Agent: Java/1.6.0_26
Host: localhost:8080
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
Transfer-Encoding: chunked
{binary data here}
我正在尝试做什么? Content-Type
实际上应该阅读multipart/x-gzip
吗?我注意到当它被压缩时,边界文本被排除在Content-Type
标题之外 - 这也是一个问题吗?
答案 0 :(得分:4)
我遇到了同样的问题(或非常相似的问题),并在使用Content-Type
时将其跟踪到boundary
标头缺少GZIPContentEncodingFilter
参数。在设置我从Jersey客户端POST的实体的类型时,我能够使用MultiPartMediaTypes.createFormData()来解决它。这样做可以确保boundary
参数的设置早于Jersey会自动设置它,这在使用GZIPContentEncodingFilter
压缩请求实体时似乎为时已晚。 multipart/mixed
有一个等效的方法。
我没有IDE,但有类似的东西:
// client is a Jersey Client object
client.resource(uri).entity(multipartFormData, MultiPartMediaTypes.createFormData()).post(ClientResponse.class);
所有这一切,只有当您的服务器能够处理GZIP压缩请求时,这仍然有效。
答案 1 :(得分:0)
IMO你不能那样做,因为服务器和客户端需要就如何沟通达成一致(例如zip压缩)。 HTTP被设计为请求/响应,服务器可以返回客户端可以支持的内容。 客户端发出请求,说“嘿服务器,我需要这个资源,我支持gzip,所以如果可以,你可以返回gzip”。 :) 想象一下您的客户端以gzip的形式向服务器发送几兆字节的情况,但服务器不支持此功能。
Br,Petr
P.S。下次在泽西论坛直接发布文本会更好。 ;)