Dan*_*nny 5 javascript mobile-safari http-status-code-405 angularjs
我一直在尝试在AngularJS中创建一个跟踪一些统计数据的应用程序,并允许用户将它们提交到谷歌应用程序脚本以进行进一步处理.一切都在电脑上完美运行.我已经在chrome和firefox中对它进行了测试,但是当我尝试在iPad上提交它时会显示以下错误:
无法加载资源:服务器响应状态为405(方法不允许)
无法加载资源:无法从null发出任何请求.
XMLHttpRequest无法加载https://script.googleusercontent.com/macros/echo?user_content_key=UQXGbRq6...HLV301R.无法从null发出任何请求.
var URL = 'https://script.google.com/macros/s/.../exec';
$http.post(URL,
$.param({ packet: JSON.stringify($scope.data) }), {
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
}
).success(function(data, status) {
alert(data.packet);
$scope.rollover();
}).error(function(data, status) {
console.log(data);
console.log(status);
$scope.show_status(data);
});
Run Code Online (Sandbox Code Playgroud)
它在控制台中打印几行.数据行为空白,返回状态为404.
请帮忙!
此问题尚未解决,目前尚未确定修复日期。
我相信根本原因是由于 google apps 脚本无法处理 Safari 使用的 OPTIONS 方法来“预检”对其他域的非标准请求。
我正在使用的解决方法是向我的服务器发出请求,然后与谷歌应用程序脚本进行交互。不漂亮而且慢,但我需要确保网站正常运行。
这是我用来在服务器上发出请求的 php 代码,传入宏、id 和工作表作为获取参数。然后 php 返回从 google 检索到的数据:
<?php
header('Access-Control-Allow-Origin: *');
$url = 'https://script.google.com/macros/s/';
$url .= $_GET['macro'];
$url .= '/exec?id=';
$url .= $_GET['id'];
$url .= '&sheet=';
$url .= $_GET['sheet'];
function get_data2($url) {
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$response = get_data2($url);
echo $response;
?>
Run Code Online (Sandbox Code Playgroud)
现在这意味着 Safari 正在向同一域发出请求,并且我们正在遵循 google 通过 CURLOPT_FOLLOWLOCATION 插入的 403 重定向注释。
2015 年 5 月 7 日更新
我注意到,虽然我收到了405 method not allowed服务器的响应,但 Google 应用程序脚本实际上已成功接收数据。例如,我已经能够毫无问题地接收 get 和 post 参数。
为了适应这一点,我在 AJAX 调用的错误捕获中添加了一个开关,因为我实际收到的错误代码是0......很高兴看到某些东西正在工作,但我在生产中不会太信任它。