意外的PHP / jQuery / JSON交互差异

时间:2013-11-24 21:29:53

标签: javascript php jquery python json

背景:

所以,我编写了以下PHP代码片段来帮助我调试更大的问题,但是现在我对jQuery和PHP如何期望发送/接收JSON更加困惑,因为这段代码似乎没有做我期望的事情:

我希望 application/x-www-form-urlencoded(暂时)。

application/json

application/json

测试:

我一直在使用Python Requests LibraryjQuery's Ajax method测试此代码。

在Python中,数据可以作为test.php发送,也可以作为附加到请求的原始数据发送,具体取决于您提供给<?php $content_type = $_SERVER['CONTENT_TYPE']; switch ($_SERVER['REQUEST_METHOD']) { case 'GET': echo <<< _EOF <html> <body> <div id="content"></div> <script type="text/javascript" src="/jquery-1.10.2.min.js"></script> </body> </html> _EOF; break; case 'POST': header('Content-type: application/json'); if ($content_type == 'application/x-www-form-urlencoded') { $_POST['message'] = 'debugged'; echo json_encode($_POST); # Otherwise, get raw body data. } else { $data = file_get_contents('php://input'); if ($data == null) { $data = file_get_contents('php://stdin'); } $object = json_decode($data, true); $object['message'] = 'debugged'; echo json_encode($object); } break; default: echo "These aren't the droids you're looking for. Move along.<br />"; break; } 方法的application/x-www-form-urlencoded参数的类型(有关详细信息,请参阅here

到目前为止一切顺利......

使用请求,我得到了我期望的结果。

data方法的post()参数是 Python字典对象时,数据将以表格编码方式发送:

data

post()参数为文字字符串(请注意单引号!)时,数据将作为请求正文发送,并且可能(或可能不会)被解释作为端点上的JSON(我在上面的示例PHP代码中将其解释为JSON,并且保证它只会是JSON):

>>> import requests
>>> r = requests.post('http://example.com/test.php', data={"name": "tester", "message": "bug"})
>>> print r.text
{"message": "debugged", "name": "tester"}

这两个结果都是我所期望的。

这是奇怪的部分......

我似乎从这段代码得到了不同的回复,不依赖于我发送数据的 ,但 我用来发送它的内容 (即请求或jQuery)。两者之间肯定存在一些不同之处,我完全不知道。

如果我将浏览器(Chrome)指向http://example.com/test.php,则触发GET请求处理程序为我提供上面PHP代码中包含的微小HTML页面,然后在JavaScript控制台中触发以下jQuery代码,是我得到的结果:

data

到现在为止,我正在考虑, 哎呀,“名字”条目去了哪里?

事实证明,只有我在PHP处理程序中 显式设置 的内容似乎可以作为jQuery的输出进行访问。但有时我想使用用户输入的数据,修改它,然后将其作为输出返回。但是jQuery的行为就像这样,(或者PHP ......我不确定我的错误在哪个代码中)我无法做我想做的事。

Weirder仍在!

我接下来要做的是将输出消息更改为“debugged(form-data)”或“debugged(body-data)”,具体取决于是否输入了POST处理程序中的if语句或“elsed” ,并且惊讶地发现 jQuery正在将数据作为正文数据发送,但正在设置>>> r = requests.post('http://example.com/test.php', data='{"name": "tester", "message": "bug"}') >>> print r.text {"message": "debugged", "name": "tester"} 标题。这完全不是我的预期。我觉得jQuery(1.10.2)或者Python Requests中的任何一个都因为这种差异而行为不端,但我不确定是哪一个。 (或者这个ad-hoc真的发送表单编码数据吗?)

对于这里发生了什么,我缺少什么,如果我的期望或错误,我应该期待什么,甚至链接到我在研究过程中忽略的相关文档的任何想法或洞察将非常感激。

1 个答案:

答案 0 :(得分:0)

您是否尝试将标识符“name”放在引号中。这是一个保留字,一些解析器不处理它不能很好地引用它。几年前我遇到了类似的问题。