简单的jQuery,PHP和JSONP示例?

Jef*_*eff 53 php ajax jquery json jsonp

我面临同源政策问题,通过研究这个主题,我发现我的特定项目的最佳方式是使用JSONP来做跨源请求.

我一直在阅读IBM关于JSONP的这篇文章,但是我并不是100%明白发生了什么.

我在这里要求的只是一个简单的jQuery> PHP JSONP请求(或任何术语可能;)) - 这样的事情(显然它是不正确的,它只是让你可以了解我想要实现的目标) :)):

jQuery的:

$.post('http://MySite.com/MyHandler.php',{firstname:'Jeff'},function(res){
    alert('Your name is '+res);
});
Run Code Online (Sandbox Code Playgroud)

PHP:

<?php
  $fname = $_POST['firstname'];
  if($fname=='Jeff')
  {
    echo 'Jeff Hansen';
  }
?>
Run Code Online (Sandbox Code Playgroud)

我如何将其转换为适当的JSONP请求?如果我要将HTML存储在要返回的结果中,那还能工作吗?

Lia*_*ley 89

当您在外部域上使用$ .getJSON时,它会自动执行JSONP请求,例如我的推文滑块

如果查看源代码,您可以看到我使用.getJSON调用Twitter API.

所以你的例子是:这是测试和工作(你可以去http://smallcoders.com/javascriptdevenvironment.html看看它在行动)

//JAVASCRIPT

$.getJSON('http://www.write-about-property.com/jsonp.php?callback=?','firstname=Jeff',function(res){
    alert('Your name is '+res.fullname);
});

//SERVER SIDE
  <?php
 $fname = $_GET['firstname'];
      if($fname=='Jeff')
      {
          //header("Content-Type: application/json");
         echo $_GET['callback'] . '(' . "{'fullname' : 'Jeff Hansen'}" . ')';

      }
?>
Run Code Online (Sandbox Code Playgroud)

注意?回调=?和+ res.fullname

  • 永远不要回复用户提供的参数而不进行消毒! (4认同)

Ewo*_*ann 19

首先,您无法使用JSONP发出POST请求.

基本上发生的是动态插入脚本标记来加载数据.因此,只有GET请求是可能的.

此外,您的数据必须包含在回调函数中,该函数在请求完成后调用以在变量中加载数据.

整个过程由jQuery为您自动完成.仅在外部域上使用$ .getJSON并不总是有效.我可以说出个人经历.

最好的办法是添加&callback =?给你的网址.

在服务器端,您必须确保您的数据包含在此回调函数中.

即.

echo $_GET['callback'] . '(' . $data . ')';
Run Code Online (Sandbox Code Playgroud)

编辑:

没有足够的代表尚未对Liam的回答发表评论,因此解决方案就在这里.

取代利亚姆的路线

 echo "{'fullname' : 'Jeff Hansen'}";
Run Code Online (Sandbox Code Playgroud)

 echo $_GET['callback'] . '(' . "{'fullname' : 'Jeff Hansen'}" . ')';
Run Code Online (Sandbox Code Playgroud)


小智 15

更多建议

JavaScript的:

$.ajax({
        url: "http://FullUrl",
        dataType: 'jsonp',
        success: function (data) {

            //Data from the server in the in the variable "data"
            //In the form of an array

        }

});
Run Code Online (Sandbox Code Playgroud)

PHP回调:

<?php

$array = array(
     '0' => array('fullName' => 'Meni Samet', 'fullAdress' => 'New York, NY'),
     '1' => array('fullName' => 'Test 2', 'fullAdress' => 'Paris'),
);

if(isset ($_GET['callback']))
{
    header("Content-Type: application/json");

    echo $_GET['callback']."(".json_encode($array).")";

}
?>
Run Code Online (Sandbox Code Playgroud)


小智 7

要使服务器使用有效的JSONP数组进行响应,请将JSON包装在括号中()并预先校准callback:

echo $_GET['callback']."([{'fullname' : 'Jeff Hansen'}])";
Run Code Online (Sandbox Code Playgroud)

使用json_encode()将本机PHP数组转换为JSON:

$array = array(
    'fullname' => 'Jeff Hansen',
    'address' => 'somewhere no.3'
);
echo $_GET['callback']."(".json_encode($array).")";
Run Code Online (Sandbox Code Playgroud)