nighty

折腾的年华
posts - 37, comments - 143, trackbacks - 0, articles - 0

httpClient3.1中文参数GET请求的解决方法

Posted on 2008-07-16 10:31 寒武纪 阅读(5179) 评论(2)  编辑  收藏 所属分类: Java
    最近一个程序出了点问题,对于中文参数的GET请求,服务器无法解析出正确的参数。刚好服务器的那端是另一个项目组负责,是异构系统,当初测试的时候也是走流程化,涉及到很多工作上的协调就比较麻烦,测试也不充分,像赶鸭子上架一样就上线了,催说是项目紧急。当然这是话外,不多废话。
    httpClient的GetMethod类加入参数的方法是如下:
void setQueryString(NameValuePair[] params)
          Sets the query string of this HTTP method.
 void setQueryString(String queryString)
   跟踪一下httpClient的GetMethod的源代码,继承自HttpMethodBase,源码如下:
  
public void setQueryString(String queryString) {
   
this.queryString = queryString;
}

    
public void setQueryString(NameValuePair[] params) {
   LOG.trace(
"enter HttpMethodBase.setQueryString(NameValuePair[])");
   queryString 
= EncodingUtil.formUrlEncode(params, "UTF-8");
}
   EncodingUtil是httpClient定义的一个编码工具类,由于默认设置的是UTF-8,所以对于一些系统可能就无法识别。可以在外部这样更改:
method.setQueryString(EncodingUtil.formUrlEncode(pair, "GB2312"));另外,注意请求头也要修改为对应的一致编码方式,method.addRequestHeader("Content-type" , "text/html; charset=GB2312");如果这二个编码不一致,就会引起乱码。
   刚开始的时候尝试过都使用一致的UTF-8,但是发现还是乱码,这应该是服务器的原因。IE默认的就是采用操作系统Windows的中文编码去进行Encoder的,服务器原先基本上都为IE服务的,所以改为GB2312就能正常识别得到。
   另外,上面提到的EncodingUtil这个工具是从apache的另一个组件codec包装而来的,而非SUN的URLEncoder。有兴趣的可以研读一下源代码。

刚进场的时候戏就落幕

Feedback

# re: httpClient3.1中文参数GET请求的解决方法  回复  更多评论   

2008-07-16 14:21 by po
ms你的httpclient有些老。。我看到的是可以指定编码的httpclient

# re: httpClient3.1中文参数GET请求的解决方法[未登录]  回复  更多评论   

2009-06-07 23:59 by wangyazhen
写的 ,谢谢这位大哥,想问下你怎么会找到EncodingUtil这个类呢?很感兴趣!

只有注册用户登录后才能发表评论。


网站导航: