我在PHP中创建了一个简单的API。 此API echo是使用json_encode的对象。
每个例子:
echo json_encode($obj);
我正在使用jQuery从此API检索信息。 在测试脚本和API时,它们都在同一台服务器上运行。 一切都很好。
jQuery的一个例子:
$.ajax({
url: "php/api/test.php"
dataType: "json",
type: "POST",
succes: function(data) {
console.log("success");
},
error: function(response) {
console.log("error");
}
});
现在这很好用。 但是,由于API在外部服务器上运行,因此不再起作用(是的,我将URL更改为正确的URL)。
我必须改变API和javascript才能使用JSONP 在jQuery最终从API接收信息之前。
我的jQuery现在是:
$.ajax({
url: "http://externalserver/php/api/test.php"
dataType: "jsonp",
type: "POST",
succes: function(data) {
console.log("success");
},
error: function(response) {
console.log("error");
}
});
PHP将返回此信息以便工作:
echo $_REQUEST['callback'] . '(' . json_encode($obj) . ')';
现在我实际上宁愿使用JSON代替JSONP。
我知道我需要更改PHP文件,让API接受来自我这样的外部脚本的请求。
你能告诉我我需要做什么吗?
答案 0 :(得分:4)
AFAIK,您遇到了AJAX请求的跨域问题。针对此问题,最简单,最跨浏览的修复方法是使用JSONP。您的PHP脚本中没有任何确定可以解决此问题的确定因素,因为它部分归结为客户端。 Not a lot of people know how to disable the cross-domain ban either,出于测试目的,您可以考虑禁用浏览器安全性。
只要使用JSONP,说实话,它会为您节省很多麻烦。如果您已经在使用jQuery,那么您也可以使用它的最佳功能(跨域事物)。
如果您计划放弃jQuery,read up on what CORS requests entail。
答案 1 :(得分:3)
您需要在标题中设置一个允许CrossOriginRessourceSharing (CORS)的参数,否则您的浏览器将因同源策略(SOP)阻止这些调用。如果你在php中设置allow-origin-response-header,一切都应该按预期工作。
把
header('Access-Control-Allow-Origin: *');
位于test.php
顶部的将解决您的问题。 (或者最好将*
替换为您来电的特定域名。)