我必须从远程服务器获取一些JSON对象,为此我正在使用这个功能很好,除了有时一些奇怪的数据被提取,我相信是因为它使用ASCII字符集来解码。 / p>
请在下面找到我正在使用的方法
public HttpResponse call(String serviceURL,String serviceHost,String namespace,String methodName,String payloadKey, String payloadValue) throws ClientProtocolException,IOException,JSONException
{
HttpResponse response = null;
HttpContext HTTP_CONTEXT = new BasicHttpContext();
HTTP_CONTEXT.setAttribute(CoreProtocolPNames.USER_AGENT, "Mozilla/5.0");
HttpPost httppost = new HttpPost(serviceURL);
httppost.setHeader("User-Agent",Constants.USER_AGENT_BROWSER_FIREFOX);
httppost.setHeader("Accept", "application/json, text/javascript, */*");
httppost.setHeader("Accept-Language","en-US,en;q=0.8");
httppost.setHeader("Content-Encoding", "foo-1.0");
httppost.setHeader("Content-Type", "application/json; charset=UTF-8");
httppost.setHeader("X-Requested-With","XMLHttpRequest");
httppost.setHeader("Host",serviceHost);
httppost.setHeader("X-Foo-Target", String.format("%s.%s", namespace,methodName));
/*Making Payload*/
JSONObject objectForPayload = new JSONObject();
objectForPayload.put(payloadKey, payloadValue);
StringEntity stringentity = new StringEntity(objectForPayload.toString());
httppost.setEntity(stringentity);
response = client.execute(httppost);
return response;
}
我传递的所有这些标题都是正确的,如果您熟悉Mozilla,我已通过Google Chrome或Firebug插件中的inspect元素验证了相同内容。
现在的问题是,大部分时间我都在获取可读数据,但有时我会得到不可读的数据。
我使用eclipse调试并注意到wrappedEntity下的charset显示为“US-ASCII”。我附加一个jpg作为参考
有人可以告诉我如何才能在response = client.execute(httppost);
之前将字符集从ASCII更改为UTF-8。
PS:你已经注意到我在标题中传递了charset = utf-8,并且我已经使用firebug和谷歌浏览器验证了我传递了确切的标题。
请放大以更清晰地查看图像
提前致谢
答案 0 :(得分:10)
我能够解决这个问题,只是为可能面临类似问题的人提及它。
获得响应后,首先通过使用获取实体
HttpEntity entity = response.getEntity();
因为我的响应是一个json对象将实体转换为字符串但使用“UTF-8”之类的东西
responseJsonObject = new JSONObject(EntityUtils.toString(entity,"UTF-8"));
以前我只是在做
responseJsonObject = new JSONObject(EntityUtils.toString(entity));
答案 1 :(得分:2)
您可能需要添加“Accept-Encoding”-header并将其设置为“UTF-8”
答案 2 :(得分:1)
我认为你的标题不是问题,我认为你的字符串有问题。只是让标题说它是utf-8并不意味着你写的字符串是utf-8,这在很大程度上取决于字符串的编码方式以及“payloadValue”中的内容
也就是说,您可以在通过线路发送之前正确地重新编码,例如:
objectForPayload.put(payloadKey, payloadValue);
StringEntity stringentity = new StringEntity(
new String(
objectForPayload.toString().getBytes(),
"UTF8"));
看看它是否适合你。
答案 3 :(得分:0)
仅作记录:“ Content-Encoding”标头字段不正确-正确的服务器将拒绝该请求,因为该请求包含未定义的内容编码格式。
此外,将charset参数附加到application / json毫无意义。
答案 4 :(得分:0)
伯恩已经在上面的评论中回答了这个问题。
改变entity = IOUtils.toString(response.getEntity().getContent())
至entity = EntityUtils.toString(response.getEntity(),"UTF-8")
成功了。