Java REST 分块编码

Posted

技术标签:

【中文标题】Java REST 分块编码【英文标题】:Java REST Chunked Encoding 【发布时间】:2011-12-06 23:15:57 【问题描述】:

我正在尝试使用使用块编码的 REST 服务读取一些信息。

String encodedURL = URLEncoder.encode(url, "UTF-8");
WebClient client = org.apache.cxf.jaxrs.client.WebClient.create(encodedURL).accept("text/html");
Response response = client.get();

响应包含状态、元数据和实体。元数据包含以下信息:

Date=[Thu, 13 Oct 2011 13:27:02 GMT], Vary=[Accept-Encoding, User-Agent], Transfer-Encoding=[chunked], Keep-Alive=[timeout=15, 最大=100],内容类型=[文本/html;字符集=字符集=UTF-8], Connection=[Keep-Alive], X-Pad=[避免浏览器错误], 服务器=[Apache/2.2.3 (Linux/SUSE)]

并且该实体包含 sun.net.www.protocol.http.HttpURLConnection$HttpInputStream 类型的实例。

我过去,一直使用下面这行代码,来获取整个结果字符串:

String resultString = client.get(String.class);

但不知何故,这一行抛出了一个异常:

.读取响应消息时出现问题,类:类 java.lang.String,ContentType:文本/html;charset=charset=UTF-8。 org.apache.cxf.jaxrs.client.ClientWebApplicationException:.Problem 阅读响应消息,类:类 java.lang.String, 内容类型:文本/html;charset=charset=UTF-8。

...引起:

引起:java.io.UnsupportedEncodingException: charset=UTF-8 at sun.nio.cs.StreamDecoder.forInputStreamReader(Unknown Source) at java.io.InputStreamReader.(未知来源)在 org.apache.cxf.helpers.IOUtils.toString(IOUtils.java:180) 在 org.apache.cxf.helpers.IOUtils.toString(IOUtils.java:166) 在 org.apache.cxf.jaxrs.provider.PrimitiveTextProvider.readFrom(PrimitiveTextProvider.java:51) 在 org.apache.cxf.jaxrs.client.AbstractClient.readBody(AbstractClient.java:435) ... 49 更多

是否有直接的解决方案来获取响应的全部内容?

谢谢!

【问题讨论】:

【参考方案1】:

你可以使用

@Produces("application/json; charset=UTF-8")

jax-rs 服务的注释

【讨论】:

【参考方案2】:

怕是服务器端发送垃圾,导致客户端抛出异常。

有问题的部分是 Content-type HTTP 标头信息。它设置为:

text/html; charset=charset=UTF-8

如你所见,charset这个词被重复了。因此,您的客户端尝试使用称为charset=UTF-8 的编码对其进行解码,但这种编码当然不存在。

最好的解决方案是在服务器端解决问题。但我不知道你能不能把它固定在那里。如果没有,下一个最佳方法是在尝试获取响应内容之前尝试修复 HTTP 标头。

【讨论】:

谢谢科多!我不知何故完全错过了这一点。

以上是关于Java REST 分块编码的主要内容,如果未能解决你的问题,请参考以下文章

HTTP协议之chunk编码(分块传输编码)

分块编码和内容长度标头

如何告诉HTTP服务器不发送分块编码

分块传输编码 - 浏览器行为

用于分块编码 POST 的 HTTP 标头 - 错误 411

jQuery 和传输编码分块