当前位置: 首页 > 知识库问答 >
问题:

Web App在POST请求上以302状态进行respods

衡子琪
2023-03-14

我从Chrome扩展向部署为Web应用的GAS发送了一个POST请求。Chrome扩展脚本是:

const fetchData = async (scriptURL, data) => {
        try {
            const response = await fetch(scriptURL, {
                mode: 'no-cors',
                method: 'POST',
                referrer: "",
                redirect: 'follow',
                body: JSON.stringify(data), 
                headers: {
                    'Content-Type': 'application/json',
                    'Access-Control-Allow-Origin':'*'
                }                        
            });                             
            if (response != "") var json = response.json();
            console.log('Success:', JSON.stringify(json));
        } 
        catch (e){console.log('Errors:', e.message)}       
            
        return json;
    }

Web应用程序获取请求,对其进行处理并返回JSON响应:

 function doPost(e){ 
          // processing
    return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
}

虽然Chrome extension没有得到respose body。Chrome在DevTools中给出错误“未能加载响应数据”

Request URL: https://script.google.com/macros/s/AKfycbzwUUktSYViIkE-kEc9-C73ztt6Mm14GTW9tEFezIdt/exec
Request Method: POST
Status Code: 302 
Remote Address: 173.194.220.100:443
Referrer Policy: no-referrer-when-downgrade
**Response headers**
access-control-allow-origin: *
alt-svc: h3-29=":443"; ma=2592000, h3-27=":443"; ma=2592000, h3-25=":443"; ma=2592000, h3-T050=":443"; ma=2592000, h3-Q050=":443"; ma=2592000, h3-Q046=":443"; ma=2592000, h3-Q043=":443"; ma=2592000
cache-control: no-cache, no-store, max-age=0, must-revalidate
content-encoding: gzip
content-length: 416
content-security-policy: script-src 'report-sample' 'nonce-DROk3lWJaG4CuCxaaXZ+iQ' 'unsafe-inline' 'unsafe-eval' 'strict-dynamic' https: http:;object-src 'none';base-uri 'self';report-uri /cspreport
content-type: text/html; charset=UTF-8
date: Mon, 06 Jul 2020 19:16:47 GMT
expires: Mon, 01 Jan 1990 00:00:00 GMT
location: https://script.googleusercontent.com/macros/echo?user_content_key=3VuZ5HCCoG5098DqNcdFBjLL5kKYEi5U0ifWB9YmhR6BwH8VqCvsX8_sSZeRVkJwP1fZuSegpbhbvW6kPGda1I-6C2vyPPLIm5_BxDlH2jW0nuo2oDemN9CCS2h10ox_1xSncGQajx_ryfhECjZEnOhtPz9z4I3dzdyyINU3UA0pwpiENh8R4k1UDc5fBUkkDEzr0xNxtlsP-6Y5oFxMMg&lib=MpU1M31wDqWrblgsshTKAbKcDiPyCPu1i
pragma: no-cache
server: GSE
set-cookie: SIDCC=AJi4QfGj_nmaK5xHhkEGWyyb7dSsxg04uiw5Jp1HBnHCqmfBXd2win3dnlpVNNPsFuGVbqfUZ71m; expires=Tue, 06-Jul-2021 19:16:47 GMT; path=/; domain=.google.com; priority=high
status: 302
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
**Request Headers**
:authority: script.google.com
:method: POST
:path: /macros/s/AKfycbzwUUktSYViIkE-kEc9-C73ztt6Mm14GTW9tEFezIdt/exec
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
content-length: 344
content-type: text/plain;charset=UTF-8
cookie: .........
origin: chrome-extension://gabejmdkdkojddbfifhcceicplhpdkmn
sec-fetch-dest: empty
sec-fetch-mode: no-cors
sec-fetch-site: none
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
x-client-data: CIe2yQEIorbJAQjBtskBCKmdygEI/rzKAQjAvcoBCOfIygEYm77KAQ==

这看起来像是CORS的问题(标头,或谷歌服务器返回不透明的响应等)。

共有1个答案

巩才捷
2023-03-14

在这种情况下,我建议修改如下。

>

  • 根据我使用fetch使用doPost的Web应用程序的经验,我了解可以使用以下简单脚本。参考

      fetch(url, { method: "POST", body: JSON.stringify(obj) })
        .then((res) => {
          console.log(res.status);
          return res.text();
        })
        .then((res) => console.log(res));
    

    在这种情况下,当使用< code>headers时,我确认发生了与CORS相关的错误。而且,在Web应用程序中,似乎< code>doPost(e)的< code>e.postData.contents在有和没有此标题的情况下是相同的。

    从上面的脚本,当你的脚本被修改,它变成如下。

    const fetchData = async (scriptURL, data) => {
      var json;
      try {
        const response = await fetch(scriptURL, {
          method: 'POST',
          body: JSON.stringify(data),
        });
        if (response != "") json = await response.json();
        console.log('Success:', JSON.stringify(json));
      } catch (e) {
        console.log('Errors:', e.message)
      }
      return json;
    }
    
    async function main() {
      const res = await fetchData("https://script.google.com/macros/s/###/exec", {key1: "value1"});
      console.log(res);
    }
    
    main();
    
    • 我可以确认,当使用此修改后的脚本时,请求doPost不会发生错误

    > < li>

    在此修改中,假定< code >的< code>response返回contentservice . create text output(JSON . stringify(response))。setMimeType(ContentService。mime type . JSON);具有值。当Google Apps脚本有错误时,上面修改的脚本不起作用。所以请小心这一点。

    我认为,首先,为了确认上述脚本是否可以使用,例如,我想推荐使用以下简单的示例脚本。

      function doPost(e){ 
        return ContentService.createTextOutput(JSON.stringify(e)).setMimeType(ContentService.MimeType.JSON);
      }
    

    当您修改 Google Apps 的 Web Apps 脚本时,请将 Web Apps 重新部署为新版本。通过这种方式,最新的脚本将反映到 Web 应用中。另外,请小心这一点。

    • 网络应用
    • 利用 Web Apps with Google Apps Script

  •  类似资料:
    • 问题内容: 我刚刚更新了Angular + Ionic的新版本,并且处理远程请求的方法停止工作并始终返回404响应。 请求如下: 处理远程请求的方法的代码如下: 但是没有运气。 服务器端通过这种方式处理请求: 如果我试图使用邮递员或卷曲发送请求,一切似乎都在工作。 离子信息: AngularJS版本: 我该如何解决? 非常感谢您的任何建议 问题答案: 哼,我只是遇到了同样的问题:标头表明它已经被拿

    • 我刚刚更新了Angulal+Ionic的新版本,处理远程请求的方法停止工作,返回总是404响应。 请求如下: 请问我该怎么解决? 多谢你的忠告

    • 我正在尝试通过Laravel中的ajax推送一些数据。不幸的是,它不起作用。当我观察网络流量时,我发现: 我试图从JSGrid中获取数据,这很好。数据对象已填充。我查过了。为了进行测试,我刚刚在控制器中返回了一条短消息。但当我发送邮件请求时,它甚至没有被调用。。。 这是我的密码 Javascript: 路线: 控制器: 我期望从控制器方法中获取JSON文本作为responsemessage。但是我

    • 问题内容: 因此,我一直将以下代码放入我的React JS组件中,而我基本上是试图将两个API调用都置于一种称为的状态,但是以下代码却出现了错误: 现在,我猜我无法像我一样添加两个数据源,但是还可以怎么做呢?我只希望将来自该API请求的所有数据置于一种状态。 这是我目前收到的错误: 谢谢 问题答案: 您不能将数组“添加”在一起。使用array.concat函数(https://developer.

    • 我在这里检查了这么多相同的答案,但似乎没有什么适合我。我有Spring mvc的Spring Security性。当我的用户尝试注册时,我正在向我的控制器发送帖子数据。但它给我405帖子不支持我在安全配置中禁用了csrf令牌。请让我知道我哪里出错了?这是我的webSecurityCon 这是我的注册页面 这是我的主控制器 这是我的签名信息。

    • 嗨,我是Laravel的新手,我正在尝试用ajax表单提交构建一个登录表单。 我抄了 如果我从VerifyCsrfToken检查中排除它,我的代码工作完全正常。但是我确实希望令牌验证有效。 我读过多篇关于csrf令牌的帖子,尝试过,但仍然返回状态码419。 抱歉下面的长代码,但他们在这里(我知道我没有做任何关于设置会话和东西,请忽略现在因为代码返回419状态) 路线/web.php login.j