注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

HttpClient POST 的 UTF  

2008-10-20 17:18:29|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

本文示例源代码或素材下载

  Apache HttpClient ( http://jakarta.apache.org/commons/httpclient/ ) 是一个纯 Java 的HTTP 协议的客户端编程工具包, 对 HTTP 协议的支持相当全面, 更多细节也可以参考IBM 网站上的这篇文章 HttpClient入门 ( http://tech.ddvip.com/2008-09/122155610865844.html ).

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

  /**

  *Generatesarequestentityfromthepostparameters,ifpresent. Calls

  *{@linkEntityEnclosingMethod#generateRequestBody()}ifparametershavenotbeenset.

  *

  *@since3.0

  */

  protectedRequestEntitygenerateRequestEntity(){

    if(!this.params.isEmpty()){

      //UseaByteArrayRequestEntityinsteadofaStringRequestEntity.

      //Thisistoavoidpotentialencodingissues. Formurlencodedstrings

      //areASCIIbydefinitionbutthecontenttypemaynotbe. Treatingthecontent

      //asbytesallowsustokeepthecurrentcharsetwithoutworryingabouthow

      //thischarsetwilleffecttheencodingoftheformurlencodedstring.

      Stringcontent=EncodingUtil.formUrlEncode(getParameters(),getRequestCharSet());

      ByteArrayRequestEntityentity=newByteArrayRequestEntity(

        EncodingUtil.getAsciiBytes(content),

        FORM_URL_ENCODED_CONTENT_TYPE

      );

      returnentity;

    }else{

      returnsuper.generateRequestEntity();

    }

  }

  原来使用 NameValuePair 加入的 HTTP 请求的参数最终都会转化为 RequestEntity 提交到 HTTP 服务器, 接着在 PostMethod 的父类 EntityEnclosingMethod 中找到了如下的代码:

  /**

  *Returnstherequest'scharset. Thecharsetisparsedfromtherequestentity's

  *contenttype,unlessthecontenttypeheaderhasbeensetmanually.

  *

  *@seeRequestEntity#getContentType()

  *

  *@since3.0

  */

  publicStringgetRequestCharSet(){

    if(getRequestHeader(Content-Type)==null){

      //checkthecontenttypefromrequestentity

      //Wecan'tcallgetRequestEntity()sinceitwillprobablycall

      //thismethod.

      if(this.requestEntity!=null){

        returngetContentCharSet(

          newHeader(Content-Type,requestEntity.getContentType()));

      }else{

        returnsuper.getRequestCharSet();

      }

    }else{

      returnsuper.getRequestCharSet();

    }

  }

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

  测试首先在 Tomcat 的 ROOT WebApp 下部署一个页面 test.jsp, 作为测试页面, 主要代码片段如下:

<%@pagecontentType=text/html;charset=UTF-8%>

<%@pagesession=false%>

<%

request.setCharacterEncoding(UTF-8);

Stringval=request.getParameter(TEXT);

System.out.println(>>>>Theresultis+val);

%>

  接着写一个测试类, 主要代码如下:

  publicstaticvoidmain(Stringargs)throwsException,IOException{

    Stringurl=http://localhost:8080/test.jsp;

    PostMethodpostMethod=newUTF8PostMethod(url);

    //填入各个表单域的值

    NameValuePairdata={

        newNameValuePair(TEXT,中文),

    };

    //将表单的值放入postMethod中

    postMethod.setRequestBody(data);

    //执行postMethod

    HttpClienthttpClient=newHttpClient();

    httpClient.executeMethod(postMethod);

  }

  

  //InnerclassforUTF-8support

  publicstaticclassUTF8PostMethodextendsPostMethod{

    publicUTF8PostMethod(Stringurl){

      super(url);

    }

    @Override

    publicStringgetRequestCharSet(){

      //returnsuper.getRequestCharSet();

      returnUTF-8;

    }

  }

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

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

  END

 

http://hi.baidu.com/tangqiaoboy/blog/item/57986c0e345ff2cc7acbe109.html

笑话
  评论这张
 
阅读(1667)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016