GAS の API に js の fetch で doPost する際に
地味にハマったのでメモ。
まずは、正常に動作するもの。
fetch([post url], {
'method': 'POST',
'body': JSON.stringify([post obj]),
"Content-Type" : "application/json"
})
.then(response => {
return response.json();
})
.then(json => {
// レスポンス json の処理
})
.catch(err => {
// エラー処理
});
GAS 側はこんな感じ
function doPost(e) {
log("doPost e.postData.contents = " + e.postData.contents);
let ret = {
"message" : "success",
};
return ContentService.createTextOutput(JSON.stringify(ret)).setMimeType(ContentService.MimeType.JSON);
}
これで ret の値が json として取得出来る。ハマりポイントとして
fetch のオプションに no-cors
なるものがあるのだが
fetch([post url], {
'method': 'POST',
'mode': 'no-cors',
'body': JSON.stringify([post obj]),
"Content-Type" : "application/json"
})
.then( => {
// 省略...
にすると response.json()
が取得出来ない。no-cors
って
「同一オリジン以外も yes」では無く「同一オリジン以外は no」ということの模様。
fetchのmodeについて の記事がわかりやすいです。
no-cors
なので確かに「ダメ、CORS」ですよねー、ということで
ここを完全に読み違えてのハマりポイント。
合わせて fetch の戻り型は response オブジェクトで json 取得する場合は
response.json()
の promis 型というのも失念してて更にどハマり。
個人的にはなんで promis 型やねんというツッコミはあるものの、
それなりの理由がある設計のなのだろうと勝手に自己完結。