如何使用数组将App脚本中的POST请求发送到Firebase

时间:2020-07-14 18:51:41

标签: javascript post google-apps-script google-cloud-functions http-post

我正在尝试从App Script应用程序向firebase云功能发送POST请求。但是我无法在此请求中正确发送数组。请求以混乱的方式发送数组,导致云函数无法正确读取它

我正在使用以下代码:

    const data = {
      var1: 'string',
      var2: {name: 'object'},
      var3: new Date(),
      var4: [1, 2, 3],
      var5: [{name: 'any object'}, {name:  'inside an array'}],
    }

    const url = "https://us-central1-my-app.cloudfunctions.net/executeFunction";
  
    const options = {
      method: "post",
      "Content-Type": "application/json", //I tried to change this content-type for other options
      payload: data
    };

    const request = UrlFetchApp.fetch(url, options);

在服务器端,我尝试使用以下方式读取数据:

export const executeFunction = functions.https.onRequest(async(req, res) => {
  //option 1
  const data = JSON.parse(req.body);
  res.send(JSON.stringify(data));

  //option2
  const data = req.body;
  res.send(JSON.stringify(data);
})

但是在服务器上,req.body向我返回了以下值:

{
  "var1":"string",
  "var2":{"name":"object"},
  "var3":"2020-07-14T18:45:21.946Z",
  "var4":[Ljava.lang.Object;@5e1b03dd, // :(
  "var5":[Ljava.lang.Object;@19d93f99  // :(

如何正确获取数组值?

我怀疑这可能与字符集有关,但是我已经尝试在"Content-Type": "application/json; charset=utf-8"对象上使用options,但是它不起作用。

关于如何解决的任何想法? :)

更新

感谢@Pickachu

我必须更改2件事: -字符串化有效载荷 -将选项的键从“ Content-Type”更改为“ contentType”

代码在这里:

    const options = {
      method: "post",
      contentType: "application/json", //changed here
      payload: JSON.stringify(data) //and here
    };

    const request = UrlFetchApp.fetch(url, options);

1 个答案:

答案 0 :(得分:3)

您快要明白了。来自UrlFetcgApp的带有JSON有效负载的POST请求应将有效负载序列化:

https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String,Object)

const options = {
      ...
      payload: JSON.stringify(data)
    };

还有一个使用https触发器automatically parses the json body的firebase云功能,因此无需对其进行解析或字符串化。

export const executeFunction = functions.https.onRequest(async(req, res) => {
  const data = req.body;
  console.log(data.var1);
  console.log(data.var2);
  console.log(data.var3);
})