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
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)