【问题标题】:Sending special characters in Ajax POST and JSON在 Ajax POST 和 JSON 中发送特殊字符
【发布时间】:2014-10-17 11:04:24
【问题描述】:

@已解决

正如 James M. Lay 所解释的,我应该将我的内容类型从 application/x-www-form-urlencoded 更改为 application/json

它暗示了一个错误,因为似乎只有 UrlEnconded 类型在服务器端生成 POST 数组(至少在 PHP 中)。所以我不得不改变我在服务器脚本中接收/处理请求的方式

$json = file_get_contents('php://input'); //yes. php://input

if($json) $params = json_decode($json,true);
else $params = $_POST;

我还必须对 Javascript 代码进行一些更改,以检查内容类型并生成不同的字符串。如果是 JSON,我只使用 JSON.stringify

//string to use in the 'send' method
this.getParametersString = function(){
        if(this.contentType == 'application/json'){
            return JSON.stringify(this.parameters);
        }else{}
}

我有一个问题

我正在构建一个接收参数的函数以编写参数列表并通过 POST 发送

问题是我们不能发送特殊字符,例如+

所以我尝试使用函数encodeURIComponent 将它们编码为URI 友好的字符串。

还有一个问题:如果接收到的参数是对象,我就循环遍历属性,判断是另一个对象还是字符串,如果是对象,再循环,否则编码。

但它返回的是一个编码字符串的对象。我必须让对象变成一个字符串来发送它,为此我使用JSON.stringify。它解码编码的字符串。所以%2B 再次变为+ 并且它不会通过POST 发送到服务器。

另一方面,如果我首先使用stringify,然后使用encodeURIComponent,它会生成不应编码的“和{}”之类的符号,并且该字符串不是编写良好的JSON

你是怎么做到的?这是不使用jQuery的方法吗?我必须构建自己的字符串化函数吗?!

【问题讨论】:

  • 为什么不将所有参数串起来并发送呢? POST 格式不应依赖于参数。 stringify 在 JS 中并在服务器上解析。
  • 完全跳过encodeURIComponent。 JSON 自然可以处理特殊字符,并且 JSON.stringify() 会自动为您处理大多数边缘情况。您想要encode POST 的原因是服务器是否期待application/x-www-form-urlencoded。由于您的服务器需要 JSON,您可以直接发送普通的 JSON。
  • @JamesM.Lay 也许这就是重点。 application/x-www-form-urlencoded 是我的 Content-type 中的内容。我需要改变它吗!?我试试
  • 这里语义正确的内容类型标头是application/json,但也可以使用text/plain
  • @JamesM.Lay 似乎有一个新问题。我更改了我的代码,现在它使用 application/json 作为默认内容类型。我可以看到在标头中发送了特殊字符(刚刚测试过 + 加号),但似乎没有到达服务器。我收到空白回复。但如果我改回application/x-www-form-urlencoded,它可以正常工作(我收到一个 JSON 字符串)。知道发生了什么吗?

标签: javascript ajax json stringify encodeuricomponent


【解决方案1】:

我正在使用以下内容,我没有任何问题

encodeURIComponent(JSON.stringify(object_to_be_serialised))

【讨论】:

  • 当我有一个像{number:1} 这样的对象并且我将它字符串化时,它会生成一个如下的字符串 {"number":1}。如果转义这个字符串,它会生成另一个带有引号和大括号的字符串。但他们不应该被改变
猜你喜欢
  • 1970-01-01
  • 2018-11-08
  • 2023-03-26
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 2015-05-28
相关资源
最近更新 更多