gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:05:05 24 4
gpt4 key购买 nike

背景:

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

我希望能够以 application/x-www-form-urlencoded 的形式接收 数据application/json , 而只回应 application/json (现在)。

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;
}

测试:

我一直在使用 Python Requests Library 测试这段代码和 jQuery's Ajax method .

在 Python 中,数据可以发送为 application/x-www-form-urlencoded或作为附加到请求的原始正文数据,具体取决于 data 的类型您提供给 post() 的参数方法(有关更多信息,请参阅 here)。

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

使用 Requests,我得到的正是我所期望的。

data post() 的参数方法是一个 Python 字典对象,数据以表单编码形式发送:

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

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

>>> 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 代码,这就是我得到的结果:

> var output = null;
> $.ajax({
type: 'POST',
url: 'http://example.com/test.php',
data: {
name: 'tester',
message: 'bug'
},
dataType: 'json',
beforeSend: function(x) {
if (x && x.overrideMimeType) {
x.overrideMimeType('application/json; charset=UTF-8');
}
},
success: function(d) {
$output = d;
}
});
> output
Object {message: "debugged"}

现在我在想,“名称”条目到底去哪了?

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

更奇怪!

我接下来要做的是根据 POST 处理程序中的 if 语句是输入还是“elsed”将输出消息更改为“已调试(表单数据)”或“已调试(正文数据)” , 并且惊讶地发现 jQuery 将数据作为正文数据发送,但是设置了 application/x-www-form-urlencoded header. 这完全不是我所期望的。由于这种差异,我觉得 jQuery (1.10.2) 或 Python Requests 中的任何一个行为不正常,但我不确定是哪个。 (或者发送表单编码数据真的是临时的吗?)

任何关于这里发生的事情的想法或见解,我所缺少的,如果我的期望或错误我应该期待什么,甚至是我在研究这个问题时设法忽略的相关文档的链接,将不胜感激。

最佳答案

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

关于javascript - 意外的 PHP/jQuery/JSON 交互差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20181260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com