简单的 jQuery、PHP 和 JSONP 示例?

Posted

技术标签:

【中文标题】简单的 jQuery、PHP 和 JSONP 示例?【英文标题】:Simple jQuery, PHP and JSONP example? 【发布时间】:2011-10-12 03:36:18 【问题描述】:

我正面临同源策略问题,通过研究该主题,我发现我的特定项目的最佳方法是使用 JSONP 进行跨域请求。

我一直在阅读 this article from IBM about JSONP,但我不是 100% 清楚发生了什么。

我在这里要求的只是一个简单的 jQuery>php JSONP 请求(或任何可能的术语;)) - 像这样 (显然它是不正确的,它只是为了让您了解我想要达到的目标:) ):

jQuery:

$.post('http://MySite.com/MyHandler.php',firstname:'Jeff',function(res)
    alert('Your name is '+res);
);

PHP:

<?php
  $fname = $_POST['firstname'];
  if($fname=='Jeff')
  
    echo 'Jeff Hansen';
  
?>

我将如何将其转换为正确的 JSONP 请求?如果我将 html 存储在要返回的结果中,那也可以吗?

【问题讨论】:

【参考方案1】:

当您在外部域上使用 $.getJSON 时,它会自动执行 JSONP 请求,例如我的 tweet slider here

如果您查看源代码,您会发现我正在使用 .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'" . ')';

      
?>

注意 ?callback=?和 +res.fullname

【讨论】:

那么故事的服务器端部分呢? :) 所以不需要做 res.fullname 吗? :) 在您修改了第一条评论后,我发现了这一点 Firebug 报告“无效标签:'firstname':'Jeff'”,然后 uuhm.. 它不工作,什么都没有发生 未经清理,切勿回显用户提供的参数!【参考方案2】:

首先,您不能使用 JSONP 发出 POST 请求。

基本上正在发生的是动态插入脚本标签来加载您的数据。因此只有 GET 请求是可能的。

此外,您的数据必须包装在一个回调函数中,该函数在请求完成后调用以将数据加载到变量中。

整个过程由 jQuery 为您自动完成。只是在外部域上使用 $.getJSON 并不总是有效。我可以根据个人经验判断。

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

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

即。

echo $_GET['callback'] . '(' . $data . ')';

编辑:

还没有足够的代表来评论 Liam 的回答,所以这里的解决方案。

替换利亚姆的线路

 echo "'fullname' : 'Jeff Hansen'";

 echo $_GET['callback'] . '(' . "'fullname' : 'Jeff Hansen'" . ')';

【讨论】:

我在最后一部分窒息 - 你为什么要做'('.$data...? 正如我所说,您的数据必须包装到 Javascript 函数中。利亚姆的例子行不通。实际的响应应该是这样的:callbackFunction("fullname": "Jeff Hansen") 对不起,你错了,是的,你需要 ?callback= 在 url 上,但如果你只是做 ?callback=?您可以在第二个参数中以 JSON 格式发送数据。我知道,因为我已经做到了。 可以发送,但是不加包装回调函数是收不到的。编辑:您说的是 jQuery 中的客户端,但我说的是 PHP 中需要调整的服务器端。 你说得对,我很抱歉。我已将代码更改为花括号,但没有将文件添加到服务器。括号有效,花括号无效。答案已更新。【参考方案3】:

更多建议

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

        

);

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).")";


?>

【讨论】:

太棒了!谢谢。【参考方案4】:

要使服务器以有效的 JSONP 数组响应,请将 JSON 括在括号 () 中并预先添加 callback

echo $_GET['callback']."(['fullname' : 'Jeff Hansen'])";

使用 json_encode() 会将原生 PHP 数组转换为 JSON:

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

【讨论】:

问题是关于JSONP,它要求服务器的响应用客户端回调和括号括起来,例如callback123([a:1])【参考方案5】:

简单的 jQuery、PHP 和 JSONP 示例如下:

window.onload = function()
	$.ajax(
		cache: false,
		url: "https://jsonplaceholder.typicode.com/users/2",
		dataType: 'jsonp',
		type: 'GET',
		success: function(data)
			console.log('data', data)
		,
		error: function(data)
			console.log(data);
		
	);
;
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

【参考方案6】:
$.ajax(

        type:     "GET",
        url: '<?php echo Base_url("user/your function");?>',
        data: name: mail,
        dataType: "jsonp",
        jsonp: 'callback',
        jsonpCallback: 'chekEmailTaken',
        success: function(msg)
    
);
return true;

在控制器中:

public function ajax_checkjp()
$checkType = $_GET['name'];
echo $_GET['callback']. '(' . json_encode($result) . ');';  

【讨论】:

【参考方案7】:

使用这个..

    $str = rawurldecode($_SERVER['REQUEST_URI']);
    $arr = explode("",$str);
    $arr1 = explode("", $arr[1]);
    $jsS = ''.$arr1[0].'';
    $data = json_decode($jsS,true);

现在..

使用$data['elemname'] 访问这些值。

使用 JSON 对象发送 jsonp 请求。

请求格式:

$.ajax(
    method : 'POST',
    url : 'xxx.com',
    data : JSONDataObj, //Use JSON.stringfy before sending data
    dataType: 'jsonp',
    contentType: 'application/json; charset=utf-8',
    success : function(response)
      console.log(response);
    
) 

【讨论】:

以上是关于简单的 jQuery、PHP 和 JSONP 示例?的主要内容,如果未能解决你的问题,请参考以下文章

前端跨域之Jsonp的原生请求和Jquery的ajax请求,简单易懂。

如何使用PHP和jquery获取jsonp?

API 停止支持 JSONP

带有jquery的jsonp [关闭]

实现简单的PHP接口,以及使用js/jquery ajax技术调用此接口

html jQuery,JSON:使用JSONP的基本jQuery示例