我的JSONP代码尝试有什么问题?

时间:2016-11-27 18:27:06

标签: javascript php

所以我在外部服务器上有一个脚本,我试图从中获取数据。

它是一个名为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已启用,它看起来不像是实际的服务器配置或其他东西。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

有两个问题:

  1. JSONP中,您必须将JSON包裹在函数调用中;这就是JSONP的工作原理。

    根据您的URL,您的PHP代码的响应应为

    returnText({"result":"10"})
    

    从查询参数中获取q参数,并将其用作响应中的函数名称。 (该参数的通常名称为callback,但如果您愿意,可以将其称为其他名称。)

  2. 您已经说过调用PHP文件的script元素在head中,但定义script回调的returnText元素位于身体。这不适用于您显示的script元素,因为head中的元素将停止对页面的所有解析,使浏览器等待直到它被检索,然后仅在检索到它时运行它会允许解析继续。这意味着returnText函数尚不存在。在包含回调函数的script之后,将script查询JSONP移动到会更有意义。 (你可能会考虑async or defer。)