Posted on 2008-07-16 10:31
寒武纪 阅读(5195)
评论(2) 编辑 收藏 所属分类:
Java
最近一个程序出了点问题,对于中文参数的GET请求,服务器无法解析出正确的参数。刚好服务器的那端是另一个项目组负责,是异构系统,当初测试的时候也是走流程化,涉及到很多工作上的协调就比较麻烦,测试也不充分,像赶鸭子上架一样就上线了,催说是项目紧急。当然这是话外,不多废话。
httpClient的GetMethod类加入参数的方法是如下:
跟踪一下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。有兴趣的可以研读一下源代码。
刚进场的时候戏就落幕