405方法不允许 - 适用于除iOS Safari之外的所有内容

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.

请帮忙!

Dav*_*vid 1

请参阅https://code.google.com/p/google-apps-script-issues/issues/detail?can=2&start=0&num=100&q=&colspec=Stars%20Opened%20ID%20Type%20Status%20Summary%20Component% 20所有者&groupby=&sort=&id=3226

此问题尚未解决,目前尚未确定修复日期。

我相信根本原因是由于 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......很高兴看到某些东西正在工作,但我在生产中不会太信任它。