所以我在外部服务器上有一个脚本,我试图从中获取数据。
它是一个名为test.php的PHP脚本,内部有以下内容:
<?php
$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$parts = parse_url($url);
parse_str($parts['query'], $query);
$limit = $query['limit'];
$return_array["result"] = $limit;
echo json_encode($return_array);
?>
然后我使用以下内容向该服务器发送呼叫:
/* this is included in head */
<script src="http://some-website.com/get-text/index.php?limit=10&q=returnText"></script>
/* in Body */
<script>
function returnText(data) {
console.log('result: ' + data);
}
</script>
当你单独转到那个php页面时,输出是
{"result":"10"}
但是当我运行包含JavaScript代码的文件时,我收到错误:
index.php?limit = 10&amp; q = returnText:1 Uncaught SyntaxError:意外的令牌:
当您点击此错误行右侧的链接时,我会看到:
{"result":"10"}
从冒号开始向右下方显示红色下划线。
我看到某个地方确保JSONP已启用,它看起来不像是实际的服务器配置或其他东西。
我做错了什么?
答案 0 :(得分:1)
有两个问题:
在JSONP中,您必须将JSON包裹在函数调用中;这就是JSONP的工作原理。
根据您的URL,您的PHP代码的响应应为
returnText({"result":"10"})
从查询参数中获取q
参数,并将其用作响应中的函数名称。 (该参数的通常名称为callback
,但如果您愿意,可以将其称为其他名称。)
您已经说过调用PHP文件的script
元素在head
中,但定义script
回调的returnText
元素位于身体。这不适用于您显示的script
元素,因为head
中的元素将停止对页面的所有解析,使浏览器等待直到它被检索,然后仅在检索到它时运行它会允许解析继续。这意味着returnText
函数尚不存在。在包含回调函数的script
之后,将script
查询JSONP移动到会更有意义。 (你可能会考虑async
or defer
。)