`

HttpClient支持UTF-8的问题

阅读更多

在开发过程中,发现HttpClient不支持UTF-8编码,中文出现乱码,后来找到下面的帖子。问题解决了!

不过在实际使用中, 还是发现按照最基本的方式调用 HttpClient 时, 并不支持 UTF-8 编码, 在网络上找过一些文章, 也不得要领, 于是查看了 commons-httpclient-3.0.1 的一些代码, 首先在 PostMethod 中找到了 generateRequestEntity() 方法: 

 /** 
      * 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 中文" .

END

引:http://www.blogjava.net/NeonWay/archive/2008/03/24/78413.html

收藏个帖子:http://www.blogjava.net/nighty/archive/2008/06/11/207121.html

分享到:
评论
2 楼 xuganggogo 2009-06-01  
这到没注意,谢谢关注
1 楼 f_zongjian 2009-06-01  
HttpClient3.1中没有遇到此类问题了。

不过自己在服务端发送响应信息给请求端的时候犯了个错误:
PrintWriter out = resp.getWriter();//(1)
resp.setContentType("text/xml;charset=utf-8");//(2)
out.write("zhongwen中文");
这样是以默认的ISO-8859-1格式发送信息,请求端获取到的可能就是"zhongwen????"。
如果(1)(2)顺序换一下,那样就能以utf-8的格式发往请求端,对方接收到的就是正常的"zhongwen中文"。

相关推荐

    delphi操作utf-8转码HTTPEncode

    首先,了解UTF-8编码:UTF-8是一种变长的字节顺序编码,它可以表示Unicode字符集中的所有字符。每个Unicode字符可以由1至4个字节表示,这使得UTF-8对英文字符和大多数西方语言非常高效,同时也兼容ASCII编码。 ...

    commons-httpclient-3.1短信发送包

    Apache Commons HttpClient是Apache软件基金会的一个开源项目,主要提供了一套完整的HTTP客户端接口和实现,支持HTTP协议的各种特性,如GET、POST、PUT等方法,以及Cookie管理、连接池等高级功能。HttpClient 3.1是...

    原创: httpclient 4.0 使用 - 访问开心网的各种组件 例子

    String result = EntityUtils.toString(entity, "UTF-8"); System.out.println(result); ``` 六、Cookie 管理 开心网的某些操作可能需要维持会话,这时需要管理Cookie: ```java CookieStore cookieStore = new ...

    httpclient-4.5.3.zip

    String content = EntityUtils.toString(entity, StandardCharsets.UTF_8); } ``` 五、连接管理 HttpClient 4.5引入了连接池管理器`PoolingHttpClientConnectionManager`,可以有效地复用已建立的TCP连接,提升...

    httpclient-4.5.2.jar安卓网络请求

    String responseContent = EntityUtils.toString(entity, "UTF-8"); ``` 6. 关闭资源:最后,别忘了关闭HttpClient和响应实体,避免资源泄漏: ```java response.close(); httpClient.close(); ``` 四、HttpClient...

    HttpClient4基础1--通过匿名代理访问网页

    String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(responseBody); } finally { response.close(); } // 关闭HttpClient httpClient.close(); } } ``` 在...

    commons-httpclient.zip

    httpMethod.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8"); // 发送请求 int statusCode = httpClient.executeMethod(httpMethod); // 检查状态码 if (statusCode == ...

    HttpClient-4.0.1中文文档下载+官方教程

    URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search", URLEncodedUtils.format(qparams, "UTF-8"), null); HttpGet httpget = new HttpGet(uri); ``` #### 四、HTTP 响应 **HTTP 响应** 由...

    httpclient4.2.1.zip

    String content = EntityUtils.toString(entity, StandardCharsets.UTF_8); ``` 四、HttpClient 4.2.1的进阶应用 除了基本的HTTP请求,HttpClient还支持更复杂的操作,如文件上传、下载、分块传输、自定义HTTP头...

    Android-HttpClient工具类简单轻松的实现getpostput和delete请求

    return EntityUtils.toString(entity, "UTF-8"); } else { throw new IOException("GET请求失败,状态码:" + status); } } // POST请求 public static String sendPostRequest(String url, List...

    HttpClient应用实例2

    在发送POST请求时,特别是包含中文字符的表单数据,我们需要使用`URLEncoder.encode()`方法将中文字符转换为URL友好的格式,并指定UTF-8编码。例如: ```java String param = "中文参数"; String encodedParam = ...

    HttpClient-4.0.1中文版官方教程

    URLEncodedUtils.format(qparams, "UTF-8"), null); HttpGet httpget = new HttpGet(uri); System.out.println(httpget.getURI()); ``` **1.1.3 HTTP 响应 (HTTP Response)** 当客户端发出请求后,服务器会返回一...

    HttpClient-中文教程

    ### HttpClient-中文教程 #### 一、概述 ... URLEncodedUtils.format(qparams, "UTF-8"), null); HttpGet httpget = new HttpGet(uri); System.out.println(httpget.getURI()); ``` 输出结果为: ``` ...

    彻底解决httpClient乱码问题

    在发送请求时,可以使用`EntityUtils.toString(entity, "UTF-8")`来指定解码的字符集,确保与服务器响应的字符集一致。 2. **HTTP头信息**:服务器可能会在响应头中包含`Content-Type`字段,指示了响应体的MIME类型...

    httpclient连接第三方接口的实际项目案例

    String result = IOUtils.toString(content, "UTF-8"); ``` 通过以上步骤,你可以使用HttpClient成功地与第三方接口进行交互,无论是GET、POST请求,还是文件上传,都可以妥善处理。在实际项目中,可能还需要根据...

    mysql.rar_JSP+Mysql_中文乱码

    在创建数据库和表时,应选择支持UTF-8的字符集,如`utf8mb4`,它是MySQL对UTF-8的扩展,能处理更多的Unicode字符。创建表时可以这样指定: ```sql CREATE TABLE `test` ( ... ) ENGINE=InnoDB DEFAULT CHARSET=...

    httpclient 4.2.2

    String responseBody = EntityUtils.toString(entity, StandardCharsets.UTF_8); ``` 5. **关闭资源**:完成操作后,别忘了关闭 HttpClient 和响应对象以释放资源。 ```java response.close(); httpClient.close()...

    httpclient官网教程中文版

    String content = EntityUtils.toString(entity, "UTF-8"); System.out.println("Response content: " + content); } } finally { response.close(); } ``` 通过以上示例,我们可以看到如何使用HttpClient发起一...

Global site tag (gtag.js) - Google Analytics