使用HttpClient 3.1设置响应编码

我正在使用org.apache.commons.httpclient.HttpClient并需要设置响应编码(由于某种原因,服务器在Content-Type中返回错误的编码)。 我的方法是将响应作为原始字节并转换为具有所需编码的String 。 我想知道是否有更好的方法来做到这一点(例如,设置HttpClient)。 谢谢你的建议。

我不认为使用HttpClient 3.x API有更好的答案。

HTTP 1.1规范明确指出客户端“必须”遵守响应头中指定的字符集,如果未指定字符集,则使用ISO-8859-1。 HttpClient API的设计假设程序员希望符合HTTP规范。 显然,您需要破坏规范中的规则,以便您可以与不兼容的服务器通信。 尽管如此,这并不是API设计者认为需要明确支持的用例。

如果您使用的是HttpClient 4.x,您可以编写自己的ResponseHandler将主体转换为HttpEntity ,忽略响应消息的名义字符集。

几点说明:

  1. 服务器提供数据,因此服务器可以以适当的格式提供服务。 因此响应编码由服务器而不是客户端设置。 但是,客户端可以通过Accept和Accept-Charset建议服务器提供它想要的格式:

     Accept: text/plain Accept-Charset: utf-8 

    但是,http服务器通常不会在格式之间进行转换。

  2. 如果选项1不起作用,那么您应该查看服务器的配置。

  3. 当String作为原始字节发送时(它始终是,因为这是网络传输的),总是会定义编码。 由于服务器生成此原始字节,因此它定义了编码。 因此,您无法获取原始字节并使用您选择的编码来创建String。 您必须使用从String转换为字节时使用的编码。

问候人们,

如果有人发现这篇文章谷歌搜索设置HttpClient写入UTF-8,Jus。

这行代码应该很方便……

 response.setContentType("text/html; charset=UTF-8"); 

最好

免责声明:我不是真正了解HttpClient,只是阅读API。

我会使用execute方法返回一个HttpResponse,然后是.getEntity().getContent() 。 这是一个纯字节流,所以如果你想忽略服务器告诉的编码,你可以简单地将自己的InputStreamReader包装起来。


好吧,看起来我有错误的版本(显然,那里有太多的HttpClient类)。

但是和以前一样,只是位于其他类上: HttpMethod有一个getResponseBodyAsStream()方法,你可以围绕它自己包装自己的InputStreamReader。 (或者一次获取整个数组,如果它不是太大,并将其转换为String,就像你写的那样。)

我想尝试改变响应并让HttpClient分析它并不是正确的方法。


不过,我建议向服务器管理员/网站管理员发送有关错误字符集的消息。