【问题标题】:Set response encoding with HttpClient 3.1使用 HttpClient 3.1 设置响应编码
【发布时间】:2011-02-28 13:49:18
【问题描述】:

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

【问题讨论】:

    标签: java apache-commons-httpclient


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      几点说明:

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

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

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

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

      3. 当字符串作为原始字节发送时(它总是这样,因为这是网络传输的内容),总是有定义的编码。由于服务器产生这个原始字节,它定义了编码。因此,您不能获取原始字节并使用您选择的编码来创建字符串。您必须使用从字符串转换为字节时使用的编码。

      【讨论】:

      • 嗨,我没有服务器在我的控制之下,它在 Content-Type 属性中返回错误的编码(HttpClient.getResponseBodyAsString() 在响应标头中从 Content-Type 属性中获取编码)。正如您在请求标头中提到的那样,我已经尝试设置 Accept 和 Accept-Charset ,但这对我没有帮助。显然这是服务器上的问题,但我不是所有者,所以我无法对其进行更改。
      • 谢谢 ;)。无论如何,你为什么要为字符编码所困扰?在 Java 中,您可以使用任何编码获取原始字节并从中生成一个字符串。
      • 我只是不喜欢破坏API规则的方式,所以我想知道可能性。
      【解决方案3】:

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

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


      好的,看来我的版本有误(显然,HttpClient 类太多了)。

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

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


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

      【讨论】:

        【解决方案4】:

        大家好,

        以防万一有人发现这篇文章在谷歌上搜索设置 HttpClient 以使用 UTF-8 编写。

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

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

        最好的

        【讨论】:

        • 您好,感谢您的评论。能否请您发布完整的源代码,在哪里清楚 response 是什么对象。
        • 您好,谢谢!我想我应该足以说 HttpServletResponse 响应
        • 您好,我正在使用 Apache HttpClient 下载数据。我没有使用Servlet,所以没有HttpServletResponse
        猜你喜欢
        • 2011-10-26
        • 2012-08-27
        • 2023-04-02
        • 2012-05-28
        • 1970-01-01
        • 1970-01-01
        • 2013-07-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多