【发布时间】:2020-10-27 00:06:27
【问题描述】:
我从 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 App 获取请求,对其进行处理并返回 JSON 响应:
function doPost(e){
// processing
return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
}
虽然 Chrome 扩展没有返回 respose 正文。 Chrome 在 DevTools->Network->Response 中给出错误“无法加载响应数据”。以下是请求和响应标头:
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 的问题(标头或谷歌服务器返回不透明的响应等)。
【问题讨论】:
-
@OlegValter 我的理论是 OP 没有显示“跟随”网络请求,这发生在 OP 显示之后,然后 无法加载响应数据。如果只是 302,则没有任何错误原因。预检请求肯定会失败。而“no-cors”只会返回“不透明的过滤响应”(=== nothing)=> 这与 Chrome 扩展程序不会返回响应正文 一致。所以是的,这是一个猜测;)
-
@TheMaster - 啊,我现在明白你的推理了,嗯。很高兴看到对此的一些澄清 - @Sturmer?当然,不透明的响应部分应该是你提到的。顺便说一句,可能相关(虽然不是欺骗目标):"Failed to load response data"
-
我为您的问题提出了修改后的脚本。你能确认一下吗?如果这不是您期望的结果,我深表歉意。
-
只需将 contentType 更改为“text/plain”。一切都会自行解决。
标签: javascript google-apps-script google-chrome-extension cross-domain