6

我必须从远程服务器获取一些 JSON 对象,为此我正在使用这个功能很好,除了有时会获取一些奇怪的数据,我认为这是因为它使用 ASCII 字符集进行解码。

请在下面找到我正在使用的方法

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 插件中的检查元素验证了相同的标题。

现在的问题是,大多数时候我都得到了可读数据,但有时我得到了不可读的数据。

我使用 eclipse 进行调试,并注意到 WrappedEntity 下的字符集显示为“US-ASCII”。我附上一张jpg供参考在此处输入图像描述

有人可以告诉我如何在我做之前将响应的字符集从 ASCII 更改为 UTF-8 response = client.execute(httppost);。PS:正如您所注意到的,我在标题中传递了 charset=utf-8 并且我已经使用 firebug 和 google chrome 验证了我正在传递确切的标题。

请放大以更清楚地看到图像

提前致谢

4

5 回答 5

11

我能够解决这个问题,只是为可能面临类似问题的人提及它。在获得响应后,首先通过使用获取实体 HttpEntity entity = response.getEntity(); ,因为我的响应是一个 json 对象,将实体转换为字符串,但使用“UTF-8”这样的东西 responseJsonObject = new JSONObject(EntityUtils.toString(entity,"UTF-8"));

以前我只是在做 responseJsonObject = new JSONObject(EntityUtils.toString(entity));

于 2013-08-04T20:43:45.997 回答
2

您可能需要添加“Accept-Encoding”标头并将其设置为“UTF-8”

于 2013-08-04T19:43:35.410 回答
2

我不认为这是您的标题的问题,我认为这是您的字符串的问题。只是让标头说它是 utf-8 并不意味着您编写的字符串是 utf-8,这在很大程度上取决于字符串的编码方式以及“payloadValue”中的内容

也就是说,您始终可以在通过网络发送之前正确地重新编码,例如:

objectForPayload.put(payloadKey, payloadValue);
StringEntity stringentity = new StringEntity(
   new String(
      objectForPayload.toString().getBytes(),
      "UTF8"));

看看这是否适合你。

于 2013-08-04T20:14:40.893 回答
1

仅作记录:“Content-Encoding”标头字段不正确 - 正确的服务器会拒绝请求,因为它包含未定义的内容编码格式。

此外,将 charset 参数附加到 application/json 是没有意义的。

于 2019-01-04T14:19:11.820 回答
0

伯恩已经在上面的评论中回答了这个问题。

更改为entity = IOUtils.toString(response.getEntity().getContent())
成功entity = EntityUtils.toString(response.getEntity(),"UTF-8")
了。

于 2021-01-20T07:37:56.803 回答