`
MauerSu
  • 浏览: 514794 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

httpclient 接收参数乱码

 
阅读更多
源:http://www.blogjava.net/thinkbase/archive/2006/10/31/HttpClientPOST_UTF8.html
评:
Apache HttpClient ( http://jakarta.apache.org/commons/httpclient/ ) 是一个纯 Java 的HTTP 协议的客户端编程工具包, 对 HTTP 协议的支持相当全面, 更多细节也可以参考IBM 网站上的这篇文章 HttpClient入门 ( http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/ ).

问题分析
不过在实际使用中, 还是发现按照最基本的方式调用 HttpClient 时, 并不支持 UTF-8 编码, 在网络上找过一些文章, 也不得要领, 于是查看了 commons-httpclient-3.0.1 的一些代码, 首先在 PostMethod 中找到了 generateRequestEntity() 方法:
    /**
     * Generates a request entity from the post parameters, if present.  Calls
     * {@link EntityEnclosingMethod#generateRequestBody()} if parameters have not been set.
     *
     * @since 3.0
     */
    protected RequestEntity generateRequestEntity() {
        if (!this.params.isEmpty()) {
            // Use a ByteArrayRequestEntity instead of a StringRequestEntity.
            // This is to avoid potential encoding issues.  Form url encoded strings
            // are ASCII by definition but the content type may not be.  Treating the content
            // as bytes allows us to keep the current charset without worrying about how
            // this charset will effect the encoding of the form url encoded string.
            String content = EncodingUtil.formUrlEncode(getParameters(), getRequestCharSet());
            ByteArrayRequestEntity entity = new ByteArrayRequestEntity(
                EncodingUtil.getAsciiBytes(content),
                FORM_URL_ENCODED_CONTENT_TYPE
            );
            return entity;
        } else {
            return super.generateRequestEntity();
        }
    }

原来使用 NameValuePair 加入的 HTTP 请求的参数最终都会转化为 RequestEntity 提交到 HTTP 服务器, 接着在 PostMethod 的父类 EntityEnclosingMethod 中找到了如下的代码:
    /**
     * Returns the request's charset.  The charset is parsed from the request entity's
     * content type, unless the content type header has been set manually.
     *
     * @see RequestEntity#getContentType()
     *
     * @since 3.0
     */
    public String getRequestCharSet() {
        if (getRequestHeader("Content-Type") == null) {
            // check the content type from request entity
            // We can't call getRequestEntity() since it will probably call
            // this method.
            if (this.requestEntity != null) {
                return getContentCharSet(
                    new Header("Content-Type", requestEntity.getContentType()));
            } else {
                return super.getRequestCharSet();
            }
        } else {
            return super.getRequestCharSet();
        }
    }


解决方案
从上面两段代码可以看出是 HttpClient 是如何依据 "Content-Type" 获得请求的编码(字符集), 而这个编码又是如何应用到提交内容的编码过程中去的. 按照这个原来, 其实我们只需要重载 getRequestCharSet() 方法, 返回我们需要的编码(字符集)名称, 就可以解决 UTF-8 或者其它非默认编码提交 POST 请求时的乱码问题了.

测试
首先在 Tomcat 的 ROOT WebApp 下部署一个页面 test.jsp, 作为测试页面, 主要代码片段如下:
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ page session="false" %>
<%
request.setCharacterEncoding("UTF-8");
String val = request.getParameter("TEXT");
System.out.println(">>>> The result is " + val);
%>


接着写一个测试类, 主要代码如下:
    public static void main(String[] args) throws Exception, IOException {
        String url = "http://localhost:8080/test.jsp";
        PostMethod postMethod = new UTF8PostMethod(url);
        //填入各个表单域的值
        NameValuePair[] data = {
                new NameValuePair("TEXT", "中文"),
        };
        //将表单的值放入postMethod中
        postMethod.setRequestBody(data);
        //执行postMethod
        HttpClient httpClient = new HttpClient();
        httpClient.executeMethod(postMethod);
    }
   
    //Inner class for UTF-8 support
    public static class UTF8PostMethod extends PostMethod{
        public UTF8PostMethod(String url){
            super(url);
        }
        @Override
        public String getRequestCharSet() {
            //return super.getRequestCharSet();
            return "UTF-8";
        }
    }


运行这个测试程序, 在 Tomcat 的后台输出中可以正确打印出 ">>>> The result is 中文" .

代码下载
本文所提到的所有代码, 以及测试程序(可直接导入 eclipse)提供打包下载: att:HttpClient POST 的 UTF-8 编码问题.httpClientUTF8.tar.bz2

END
分享到:
评论

相关推荐

    HttpClient、乱码解决:实例

    通过上述步骤,你应该能有效地解决HttpClient在发送和接收数据时可能出现的乱码问题。在实际项目中,要结合服务器的响应情况灵活调整编码策略,确保数据传输的准确性。同时,了解并熟练掌握HttpClient的使用,对于...

    解决HttpClient中文乱码问题jar文件

    HttpClient中文乱码问题的核心在于字符编码不一致或者未明确指定。默认情况下,HttpClient可能使用ISO-8859-1作为编码,而我们的中文字符通常需要UTF-8编码才能正确显示。以下是一些解决HttpClient中文乱码问题的...

    Java后端HttpClient Post提交文件流 及服务端接收文件流

    HttpClient Post提交多文件及多个普通参数,已经封装成工具类。 需传入 要请求的url 普通参数map 例 map.put("param1","张三"); 需要传入的文件流map 其中key为文件名 服务端接收无乱码。

    android客户端向服务器提交请求的中文乱码问题

    在Android客户端向服务器提交请求时,遇到中文乱码问题是一个常见的困扰。这通常是由于编码格式不一致或处理不当导致的。以下将详细解释这个问题的原因、影响以及如何解决。 首先,我们要明白字符编码的基本原理。...

    解决了中文乱码的http的get和post请求demo

    首先,我们需要理解中文乱码问题产生的原因。当HTTP请求发送含有中文字符的数据时,如果编码格式不一致或未正确指定,接收端就可能无法正确解码,从而导致乱码。HTTP协议本身并不规定字符编码,而是依赖于Content-...

    httpclient 上传文件

    然而,当我们提到“乱码问题”时,这可能涉及到两个方面:请求参数的编码和响应内容的解码。在HTTPClient中,你可以通过设置合适的字符集来处理这个问题。例如,在构建`MultipartEntityBuilder`时,可以设置`Charset...

    一个使用HttpClient调用天气预报接口的例程

    在Android开发中,HttpClient是一个常用的库,用于向服务器发送HTTP请求并接收响应。在这个例程中,我们将深入探讨如何利用HttpClient来调用一个天气预报接口,并解析返回的JSON数据。以下是一些关键知识点: 1. **...

    HttpClient应用实例2

    在HttpClient中,乱码问题通常出现在两个方面:请求参数的编码和响应内容的解码。请求参数的编码涉及到URL编码,特别是包含非ASCII字符的字符串。而响应内容的解码则涉及接收服务器返回的HTML或JSON等文本内容时的...

    http请求工具类HttpClientUtil,get,post请求(csdn)————程序.pdf

    - `doGetJson` 方法接收三个参数:URL、Header Map 和参数 Map。它首先构建一个 `HttpGet` 对象,如果参数 Map 不为空,则将参数拼接到 URL 后面,然后使用 `URLDecoder.decode` 对 URL 进行解码,以处理 URL 编码...

    HttpClient以及获取页面内容应用

    使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。 1.创建HttpClient对象。 HttpClient client = new HttpClient(); 2.创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;...

    HttpClient PostMethod 上传文件

    HttpClient是Apache基金会开发的一个HTTP客户端库,广泛应用于Java开发者中,用于发送HTTP请求并接收响应。在本示例中,我们将深入探讨如何使用HttpClient的PostMethod来上传文件,以及处理Get和Post请求中的乱码...

    Android学习之HttpClient练习(一)

    HttpClient是一个Java实现的HTTP客户端,它允许开发者发送HTTP请求并接收响应,支持多种HTTP方法如GET、POST、PUT等。在Android中,HttpClient通过Apache的HttpCore和HttpComponents库提供服务。 **1. 添加...

    java发送HttpClient请求及接收请求结果过程的简单实例

    这里,我们将JSON字符串编码为UTF-8,以防止中文乱码,并设置其内容类型为`application/json`。 - 使用`httpClient.execute(method)`来执行POST请求,并获取`HttpResponse`对象。 2. **处理响应**: - 检查`...

    httpclient模拟post请求json封装表单数据的实现方法

    我们使用 `new StringEntity(jsonParam.toString(), "utf-8")` 创建了一个新的 `StringEntity` 实例,并指定字符编码为 UTF-8,以避免中文乱码问题。 设置 `StringEntity` 的内容类型为 `application/json`,这是...

    HttpClient学习笔记

    HttpClient是Java开发中的一个关键工具,它允许开发者通过HTTP/1.1和HTTP/2协议发送请求并接收响应。HttpClient提供了丰富的API,可以方便地进行GET、POST、PUT、DELETE等HTTP方法的操作,并支持HTTPS、连接管理、重...

    httpclient发送post请求.docx

    执行POST请求是通过调用`httpClient`对象的`execute`方法实现的,它接收`HttpPost`对象作为参数,返回一个`CloseableHttpResponse`,代表服务器的响应。 ```java CloseableHttpResponse response = httpClient....

    Android中HTTP请求中文乱码解决办法

    在Android应用开发中,进行HTTP请求时可能会遇到中文乱码的问题。这通常发生在发送或接收包含中文字符的数据时。在本篇文章中,我们将探讨如何解决Android中HTTP请求中文乱码的常见问题,并通过一个具体的例子来说明...

    android POST数据遇到的UTF-8编码(乱码)问题解决办法

    首先,问题的根源在于客户端发送的数据未指定正确的字符编码,导致服务器在接收到数据并尝试以UTF-8格式解码时出现错误。在示例中,字符“·”(MIDDLE DOT,Unicode U+00B7)在UTF-8编码下应为"C2 B7",但在ISO-...

    使用HttpClient获取网页html源代码

    接着,创建一个HttpClient实例并设置请求参数。以下是一个简单的示例: ```java import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache....

Global site tag (gtag.js) - Google Analytics