【发布时间】: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() 会自动为您处理大多数边缘情况。您想要encodePOST 的原因是服务器是否期待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