1

通过 AJAX 发布 JSON 时,我遇到了不好的情况。

出于测试目的,下面的代码重现了该问题,并在 Firefox Scratchpad 中创建(我在应用程序层使用 Backbone):

var xhr = new XMLHttpRequest();
xhr.open("POST", "/my/api/url"); // could be PUT too
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify({ test: "é" }));

实际上,无论我在 JSON 中使用什么重音字符串,它总是发送不正确(我已经在最新版本的 Firefox 和 Chrome 中进行了测试)——我可以在 Chrome DevTools/Firebug 中看到请求数据错误。在这种情况下发送的是é.

我在 Java 中找到了一种解决方法。我不会费心使用它一次或两次,但是,似乎情况并非如此。还有很多事情要做。
解决方法如下:

test = new String(test.getBytes("ISO-8859-1"), "UTF-8");

任何进一步的帮助将不胜感激。

我的设置(如果有人需要):

  • 视窗 7 x64
  • JDK 1.7 x64
  • JBoss 4.2.3
  • 高枕无忧
  • 我的Eclipse 9.1

每当它们出现时,我都会经常用有趣的数据更新这个问题。

4

2 回答 2

0

我已经解决了我自己的问题。当我使用 RESTEasy 时,我的一种方法是使用拦截器MessageBodyReader。在这堂课中,我正在阅读正文而不使用请求的编码......

曾是:

String body = new String(IOUtils.toByteArray(inputStream));

变得:

String body = new String(IOUtils.toByteArray(inputStream), request.getCharacterEncoding());
于 2013-06-13T13:51:50.597 回答
0

您没有正确传递 json

xhr.send(JSON.stringify({ test: "é" }));

也应该有像这样的键的 qoutes{ "test": "e" }

你可以使用变量

var jsonStr={ "test": "é" };
xhr.send(JSON.stringify(jsonStr));

我认为您不需要对 json 进行字符串化,因为您已将 Content-Type 设置为 json,但不确定。

希望对你有帮助...

尝试以这种方式发送参数

var params='json='+jsonStr;
xhr.send(params);
于 2013-06-11T19:58:29.223 回答