我已经制作了一个在域http://app.mydomain.tld上运行的Web应用程序 并且我在https://api.mydomain.tld上有API(API不是我开发的)。
我正在使用jQuery使用此方法进行AJAX HTTPs GET调用:
$.ajax({
url: "https://api.mydomain.tld/GetSomething/read.php",
method: "GET",
contentType:"application/json; charset=utf-8",
dataType:"json",
async:false,
headers: {"Accept": "application/json; odata=verbose" },
success: function (data) { doSomething(); },
error: function (data) { showError(); }
});
此呼叫返回了类似NetworkError: failed to execute 'send' on 'XMLHttpRequest': Failed to load 'https://api.mydomain.tld/GetSomething/read.php'
的错误。
我为Chrome添加了Access-Control-Allow-Origin扩展程序,通话正常。
所以我检查了响应头。如果未启用Chrome扩展程序,则会显示以下响应标题:
Access-Control-Allow-Origin: *
启用扩展程序时,我具有以下标题:
Access-Control-Allow-Headers: access-control-allow-methods,access-control-allow-origin
Access-Control-Allow-Methods: GET, PUT, POST, DELETE, HEAD, OPTIONS
Access-Control-Allow-Origin: *
所以我的问题(可能有一个明显的答案)是:进行正确的跨域调用是否需要这些标头? 如果是,我的API是否需要以下附加代码?
<?php
header("Access-Control-Allow-Origin","*");
header("Access-Control-Allow-Methods","GET, PUT, POST, DELETE, HEAD, OPTIONS");
header("Access-Control-Allow-Headers","access-control-allow-methods,access-control-allow-origin");
?>
我说的是对的还是我错过了一些东西以使我的通话在不更改API代码的情况下得以实现?
PS:如果可能的话,我将不使用JSONP。