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

    最近一个程序出了点问题,对于中文参数的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。有兴趣的可以研读一下源代码。

刚进场的时候戏就落幕

你可能感兴趣的:(httpClient3.1中文参数GET请求的解决方法)