我正在对我构建的自定义 api 进行 api 调用。通过curl 进行的调用工作正常。但它与 Ajax 存在问题。我了解 cors,并且我相信这可能是与 cors 相关的问题。
基本上,我有一个简单的 ajax 调用,该调用调用脚本并且必须发送自定义 header 。当我发送自定义 header 时,它会发送两次请求。至少它在存储 api 请求的服务器端显示它。每次我在下面调用这个 ajax 时,它都会显示我发出了两个请求。我不明白为什么要这样做。
当我删除自定义 header 时,它只发送一次。
$( 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");
有人有什么想法吗?
更新: 我在下面附加了两个序列化数组,它们都根据同一请求在同一时间发布到数据库。一种不带自定义 header ,一种带自定义 header 。我不明白这是怎么发生的,预检不应该向数据库发布任何内容。我对此 API 的接近副本进行了类似的调用,并且它没有发布两个请求。
不带标题的调用 a:11:{s:4:"主机";s:14:"www.websitehere.com";s:10:"连接";s:10:"保持事件状态";s:13:"缓存-控制";s:9:"max-age=0";s:29:"访问控制请求方法";s:3:"GET";s:6:"起源";s:20:"http://websitehere.com ";s:10:"用户代理";s:104:"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/41.0.2272.76 Safari/537.36";s: 30:"访问控制请求 header ";s:20:"接受,access_token";s:6:"接受";s:3:"/";s:7:"Referer";s:34:"http://websitehere.com/test_ajax.php ";s:15:"接受编码";s:19:"gzip、deflate、sdch";s:15:"接受语言";s:14:"en-US,en;q=0.8";}
使用自定义 header 进行调用 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:"用户代理";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:"接受编码";s:19:"gzip、deflate、sdch";s:15:"接受语言";s:14:"en-美国,en;q=0.8";}
当然,我确实更改了一些值。
最佳答案
我不知道为什么我最终坐下来在 jsfiddle 中测试了两者之间的区别。自定义 header 添加确实会添加到 OPTIONS 预检中。除此之外,我不知道为什么它是双重调用。唯一可能的结果是缓存版本被调用,然后在强制刷新 Material 后,如果您的网络服务器上有不正确配置的 memcache 版本或其他缓存插件,则可能会发生这种情况。
header 问题的示例
没有标题的问题示例
正如您从带有添加 header 的开发人员工具中看到的那样,它会执行预检选项请求,如果没有它,它只会收到 404。
关于php - ajax自定义 header 提交两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28910220/