我正在调用我构建的自定义api的api调用。通过卷曲调用可以正常工作。但它与Ajax存在问题。我理解角色,我相信这可能是一个与角色相关的问题。
基本上我有一个简单的ajax调用,它调用脚本并且必须发送自定义标头。当我发送自定义标头时,它会发送请求两次。至少它在服务器端显示它,它存储api请求。每次我在下面称之为ajax时,它显示我提出了两个请求。我不明白为什么会这样做。
当我删除自定义标题时,它只发送一次。
$( document ).ready(function() {
$.ajax({
url: 'https://www.website.com/test.php',
type: 'GET',
beforeSend: function (XMLHttpRequest) { XMLHttpRequest.setRequestHeader("access_token", '1111'); },
datatype: 'application/json',
success: function(data, textStatus, jqXHR) {
alert('yes');
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert('no');
console.log( errorThrown );
}
});
});
在PHP方面,我有一些常见的东西。
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Headers: access_token");
header("Cache-Control: no-cache, must-revalidate");
有人有任何想法吗?
更新: 我在下面附加了两个序列化数组,这些数组在同一个请求中同时发布到数据库。一个没有自定义标头,另一个带有自定义标头。我不明白这是怎么发生的,预检不应该向DB发布任何内容。我对此API的近似副本进行了类似的调用,但它没有发布两个请求。
没有标题的呼叫 a:11:{s:4:“主持人”; s:14:“www.websitehere.com”; s:10:“连接”; s:10:“保持活着”; s:13:“缓存 - 控制 “; S:9:” 最大年龄= 0 “; S:29:” 访问控制请求-方法 “; S:3:” GET “; S:6:” 原点 “; S:20:” http://websitehere.com“; s:10:”User-Agent“; s:104:”Mozilla / 5.0(X11; Linux x86_64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 41.0.2272.76 Safari / 537.36“; s:30:“Access-Control-Request-Headers”; s:20:“accept,access_token”; s:6:“Accept”; s:3:“ / ”; s:7 :“Referer”; s:34:“http://websitehere.com/test_ajax.php”; s:15:“Accept-Encoding”; s:19:“gzip,deflate,sdch”; s:15:“Accept-Language”; s :14: “EN-US,连接; q = 0.8”;}
使用自定义标头调用 a:9:{s:4:“主持人”; s:14:“www.websitehere.com”; s:10:“连接”; s:10:“保持活着”; s:6:“接受” S:3: “ / ”; S:6: “产地”,S:20: “http://websitehere.com”; S:12: “的access_token”; S:64:“qUTWcy3qO0Cxc4ffkuU27mmvqyDpLNz4ecB0KTu5PLUllKFb1VhaCbgarfqlDAag “; s:10:”User-Agent“; s:104:”Mozilla / 5.0(X11; Linux x86_64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 41.0.2272.76 Safari / 537.36“; s:7:” Referer“; s:34:”http://websitehere.com/test_ajax.php“; s:15:”Accept-Encoding“; s:19:”gzip,deflate,sdch“; s:15:”Accept-Language“; s:14 : “EN-US,连接; q = 0.8”;}
我确实改变了一些值。
答案 0 :(得分:0)
我不知道为什么我最终坐下来测试两者在jsfiddle中的区别。自定义标题添加确实添加了OPTIONS预检。除此之外,我不确定为什么它是双重呼唤。唯一可能的结果是调用缓存版本,然后强制刷新可能发生的材料,如果你的网络服务器上有一个不恰当配置的memcache版本或其他缓存插件。
标题问题的示例
没有标题的问题示例
正如您从开发人员工具中看到的那样,添加了标题,它会执行预检选项请求,如果没有它,它只会收到404.