Javascript 在Ajax POST和JSON中发送特殊字符

Javascript 在Ajax POST和JSON中发送特殊字符,javascript,ajax,json,stringify,encodeuricomponent,Javascript,Ajax,Json,Stringify,Encodeuricomponent,@解决 正如James M.Lay所解释的,我应该将我的内容类型从application/x-www-form-urlencoded更改为application/json 这暗示了一个错误,因为似乎只有UrlEnconded类型在服务器端(至少在PHP中)生成POST数组。因此,我必须在服务器脚本中更改接收/处理请求的方式 $json = file_get_contents('php://input'); //yes. php://input if($json) $params = json_

@解决

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

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

$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的方法吗?我必须构建自己的stringify函数吗?!

我使用以下命令,我没有任何问题

encodeURIComponent(JSON.stringify(object_to_be_serialised))

为什么不将所有参数字符串化为一个并发送它呢?POST格式不应该依赖于参数。
stringify
在JS中并在服务器上解析。完全跳过
encodeURIComponent
。JSON自然可以处理特殊字符,JSON.stringify()将自动为您处理大多数边缘案例。您希望对帖子进行
编码的原因是,如果服务器希望
application/x-www-form-urlencoded
。由于您的服务器希望JSON,您可以直接发送简单的ol'JSON。@JamesM.Lay也许这就是重点。
application/x-www-form-urle>ncoded
是我的
内容类型中的内容类型。我需要更改它吗?我将尝试这里语义正确的内容类型标题是
application/json
,但您也可以使用
text/plain
@JamesM.Lay。这似乎是一个新问题。我更改了代码,现在它使用application/json作为默认内容类型。我可以n看到头中发送了特殊字符(刚刚测试+加号),但似乎没有到达服务器。我收到一个空白响应。但是如果我改回
application/x-www-form-urlencoded
,它工作正常(我收到一个JSON字符串)。知道发生了什么吗?当我有一个类似
{number:1}的对象时
我将其字符串化,它将生成一个如下{“number”:1}所示的字符串。如果转义此字符串,它将生成另一个带引号和花括号的字符串。但它们不应该被更改