使用HttpClient 3.1设置响应编码

时间:2011-02-28 13:49:19

标签: java apache-commons-httpclient

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

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

一些注意事项:

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

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

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

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

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

答案 2 :(得分:0)

免责声明:我不是真的知道HttpClient,只是阅读API。

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


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

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

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


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

答案 3 :(得分:0)

问候人,

如果有人发现此帖子谷歌搜索设置HttpClient以UTF-8写入。

这行代码应该很方便......

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

最佳