使用Apache HttpClient进行响应编码是不正确的

时间:2012-06-12 12:32:17

标签: java encoding apache-httpclient-4.x

我正在调用一个使用Apache HttpClient返回JSON的restful服务。

问题是当我在不同平台上运行代码时,我在响应的编码方面得到了不同的结果。

这是我的代码:

GetMethod get = new GetMethod("http://urltomyrestservice");
get.addRequestHeader("Content-Type", "text/html; charset=UTF-8");
...
HttpResponse response = httpexecutor.execute(request, conn, context);
response.setParams(params);
httpexecutor.postProcess(response, httpproc, context);
StringWriter writer = new StringWriter();
IOUtils.copy(response.getEntity().getContent(), writer);

当我在OSX上运行时,亚洲字符等返回正常张惠妹在回应中。但是当我在linux服务器上运行时,相同的代码显示的字符为???

linux服务器是运行Java 1.6.0_26-b03的Amazon EC2实例 我的本地OSX正在运行1.6.0_29-b11

任何想法真的很感激!!!!!

2 个答案:

答案 0 :(得分:1)

如果你看一下org.apache.commons.io.IOUtils.copy(InputStream, Writer)的javadoc:

  

使用默认值将InputStream中的字节复制到Writer上的字符   平台的字符编码。

因此,根据客户(您正在看到的内容)会给出不同的答案

此外,Content-Type通常是响应标头(除非您使用的是POST或PUT)。服务器很可能会忽略它(尽管你可能对Accept-Charset请求标题更加幸运。)

您需要解析响应头的内容类型的charset-encoding参数,并使用该参数将响应转换为String(如果它实际上是String之后)。我希望Commons HTTP有代码可以自动为您完成。如果没有,Spring的RESTTemplate肯定会。

答案 1 :(得分:0)

我认为问题不在于HTTP编码,而在于其他地方(例如,在阅读或形成答案时)。你从哪里获得内容和方式?这是存储在数据库或文件中吗?