简单的jQuery,PHP和JSONP示例?
我面临着同源政策问题,通过研究该主题,我发现对我的特定项目而言,最好的方法是使用JSONP进行跨域请求。
我一直在阅读IBM的有关JSONP的这篇文章,但是我对所发生的事情并不十分了解。
我在这里只需要一个简单的jQuery> PHP JSONP请求(或任何术语即可;))-像这样(显然这是不正确的,只是为了让您了解我要实现的目标 :)):
jQuery的:
$.post('http://MySite.com/MyHandler.php',{firstname:'Jeff'},function(res){
alert('Your name is '+res);
});
PHP:
$fname = $_POST['firstname'];
if($fname=='Jeff')
{
echo 'Jeff Hansen';
}
?>
我将如何将其转换为正确的JSONP请求? 而且,如果我将HTML存储在要返回的结果中,那也行得通吗?
7个解决方案
89 votes
当您在外部域上使用$ .getJSON时,它会自动处理JSONP请求,例如,我在这里的tweet滑块
如果查看源代码,可以看到我正在使用.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
$fname = $_GET['firstname'];
if($fname=='Jeff')
{
//header("Content-Type: application/json");
echo $_GET['callback'] . '(' . "{'fullname' : 'Jeff Hansen'}" . ')';
}
?>
注意?callback =? 和+ res.fullname
Liam Bailey answered 2020-01-07T06:17:32Z
19 votes
首先,您无法使用JSONP发出POST请求。
基本上发生的是动态插入脚本标签来加载数据。 因此,仅GET请求是可能的。
此外,您的数据必须包装在一个回调函数中,在请求完成后将其加载以将数据加载到变量中。
整个过程由jQuery为您自动化。 但是,仅在外部域上使用$ .getJSON并不总是有效。 我可以凭个人经验说出来。
最好的办法是添加&callback =? 给你网址。
在服务器端,您必须确保将数据包装在此回调函数中。
即。
echo $_GET['callback'] . '(' . $data . ')';
编辑:
没有足够的代表来评论Liam的答案,因此这里的解决方案。
替换利亚姆的电话
echo "{'fullname' : 'Jeff Hansen'}";
与
echo $_GET['callback'] . '(' . "{'fullname' : 'Jeff Hansen'}" . ')';
Ewout Kleinsmann answered 2020-01-07T06:18:36Z
15 votes
更多建议
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回调:
$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).")";
}
?>
Meni Samet answered 2020-01-07T06:19:04Z
7 votes
要使服务器使用有效的JSONP数组进行响应,请将JSON包装在括号2991740896428819456中,并在其前添加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).")";
mckoch answered 2020-01-07T06:19:29Z
2 votes
下面是简单的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);
}
});
};
Mayur S answered 2020-01-07T06:19:57Z
0 votes
$.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) . ');';
}
user4000483 answered 2020-01-07T06:20:17Z
0 votes
用这个 ..
$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);
}
})
Atul Sharma answered 2020-01-07T06:20:54Z