405 Method Not Allowed - 适用于除 iOS Safari 之外的所有设备

Posted

技术标签:

【中文标题】405 Method Not Allowed - 适用于除 iOS Safari 之外的所有设备【英文标题】:405 Method Not Allowed - Works on everything except iOS Safari 【发布时间】:2014-06-12 05:26:23 【问题描述】:

我一直在尝试在 AngularJS 中创建一个应用程序来跟踪一些统计数据并允许用户将它们提交到谷歌应用程序脚本以进行进一步处理。一切都在计算机上完美运行。我已经在 chrome 和 firefox 中测试过,但是当我尝试在 iPad 上提交时,它显示以下错误:

加载资源失败:服务器响应状态为 405 (Method Not Allowed)

加载资源失败:无法从 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);
);

它在控制台中打印几行。数据行为空,返回状态为404。

请帮忙!

【问题讨论】:

我在下面发布了更新 【参考方案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%20Owner&groupby=&sort=&id=3226

此问题仍有待解决,当前没有设置修复日期。

我认为根本原因是谷歌应用程序脚本无法处理 Safari 用于“预检”其他域的非标准请求的 OPTIONS 方法。

我正在使用的解决方法是向我的服务器发出请求,然后与谷歌应用程序脚本进行交互。不漂亮也不慢,但我需要确保网站正常运行。

这是我用来在服务器上发出请求的 php 代码,将宏、id 和工作表作为 get 参数传递。然后 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;

?>

这意味着 Safari 正在向同一个域发出请求,而且我们正在遵循 403 重定向说明,谷歌友好地使用 CURLOPT_FOLLOWLOCATION 设置。

2015 年 5 月 7 日更新

我注意到,虽然我收到了来自服务器的 405 method not allowed 响应,但 Google 应用脚本实际上已成功接收到数据。例如,我已经能够毫无问题地接收 get 和 post 参数。

为了适应这一点,我在 AJAX 调用的错误捕获中添加了一个开关,因为我实际收到的错误代码是 0... 很高兴看到某些东西正在工作,但我不会在生产中过于信任它。

【讨论】:

以上是关于405 Method Not Allowed - 适用于除 iOS Safari 之外的所有设备的主要内容,如果未能解决你的问题,请参考以下文章

jersey中的405错误 method not allowed

报错:get 。。。405 (Method Not Allowed)

代号一:405 Method Not Allowed 错误

为啥此请求返回 405 Method Not Allowed?

这是啥 405 Method Not Allowed svn 错误?

CORS customheaders 不工作 405 Method Not Allowed