LoginSignup
5
3

More than 1 year has passed since last update.

GAS の API に js の fetch で doPost する

Posted at

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 型やねんというツッコミはあるものの、
それなりの理由がある設計のなのだろうと勝手に自己完結。

5
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3