在开发过程中,发现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
分享到:
相关推荐
首先,了解UTF-8编码:UTF-8是一种变长的字节顺序编码,它可以表示Unicode字符集中的所有字符。每个Unicode字符可以由1至4个字节表示,这使得UTF-8对英文字符和大多数西方语言非常高效,同时也兼容ASCII编码。 ...
Apache Commons HttpClient是Apache软件基金会的一个开源项目,主要提供了一套完整的HTTP客户端接口和实现,支持HTTP协议的各种特性,如GET、POST、PUT等方法,以及Cookie管理、连接池等高级功能。HttpClient 3.1是...
String result = EntityUtils.toString(entity, "UTF-8"); System.out.println(result); ``` 六、Cookie 管理 开心网的某些操作可能需要维持会话,这时需要管理Cookie: ```java CookieStore cookieStore = new ...
String content = EntityUtils.toString(entity, StandardCharsets.UTF_8); } ``` 五、连接管理 HttpClient 4.5引入了连接池管理器`PoolingHttpClientConnectionManager`,可以有效地复用已建立的TCP连接,提升...
String responseContent = EntityUtils.toString(entity, "UTF-8"); ``` 6. 关闭资源:最后,别忘了关闭HttpClient和响应实体,避免资源泄漏: ```java response.close(); httpClient.close(); ``` 四、HttpClient...
String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(responseBody); } finally { response.close(); } // 关闭HttpClient httpClient.close(); } } ``` 在...
httpMethod.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8"); // 发送请求 int statusCode = httpClient.executeMethod(httpMethod); // 检查状态码 if (statusCode == ...
URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search", URLEncodedUtils.format(qparams, "UTF-8"), null); HttpGet httpget = new HttpGet(uri); ``` #### 四、HTTP 响应 **HTTP 响应** 由...
String content = EntityUtils.toString(entity, StandardCharsets.UTF_8); ``` 四、HttpClient 4.2.1的进阶应用 除了基本的HTTP请求,HttpClient还支持更复杂的操作,如文件上传、下载、分块传输、自定义HTTP头...
return EntityUtils.toString(entity, "UTF-8"); } else { throw new IOException("GET请求失败,状态码:" + status); } } // POST请求 public static String sendPostRequest(String url, List...
在发送POST请求时,特别是包含中文字符的表单数据,我们需要使用`URLEncoder.encode()`方法将中文字符转换为URL友好的格式,并指定UTF-8编码。例如: ```java String param = "中文参数"; String encodedParam = ...
### HttpClient-中文教程 #### 一、概述 ... URLEncodedUtils.format(qparams, "UTF-8"), null); HttpGet httpget = new HttpGet(uri); System.out.println(httpget.getURI()); ``` 输出结果为: ``` ...
在发送请求时,可以使用`EntityUtils.toString(entity, "UTF-8")`来指定解码的字符集,确保与服务器响应的字符集一致。 2. **HTTP头信息**:服务器可能会在响应头中包含`Content-Type`字段,指示了响应体的MIME类型...
String result = IOUtils.toString(content, "UTF-8"); ``` 通过以上步骤,你可以使用HttpClient成功地与第三方接口进行交互,无论是GET、POST请求,还是文件上传,都可以妥善处理。在实际项目中,可能还需要根据...
在创建数据库和表时,应选择支持UTF-8的字符集,如`utf8mb4`,它是MySQL对UTF-8的扩展,能处理更多的Unicode字符。创建表时可以这样指定: ```sql CREATE TABLE `test` ( ... ) ENGINE=InnoDB DEFAULT CHARSET=...
String responseBody = EntityUtils.toString(entity, StandardCharsets.UTF_8); ``` 5. **关闭资源**:完成操作后,别忘了关闭 HttpClient 和响应对象以释放资源。 ```java response.close(); httpClient.close()...
String content = EntityUtils.toString(entity, "UTF-8"); System.out.println("Response content: " + content); } } finally { response.close(); } ``` 通过以上示例,我们可以看到如何使用HttpClient发起一...