UrlFetchApp Google Scripts VS Node Fetch 修改点:修改后的脚本:参考:

问题描述

我在使用 UrlFetchApp 在 Google Scripts 上执行简单的 POST 请求时遇到了一些问题。

代码在带有 node-fetch 库的 NodeJS 上运行良好。

const fetch = require('node-fetch');
const URL = "https://login.XXXXXXXXXXXXX.com.br/api/login"

fetch(URL,{
  "body": "{'my_json_data': 'login data'}","method": "POST",}).then(res => res.text())
  .then(body => console.log(JSON.parse(body)));

对使用 UrlFetchApp 的 Google Scripts 项目的相同请求给了我 403 Forbidden HTTP 错误

var url = 'https://login.XXXXXXXXX.com.br/api/login';
  var data = {
    'email':'EMAIL','password':'PASS'
  }

  var options = {
    method: 'POST',payload: JSON.stringify(data)
  }

  var response = UrlFetchApp.fetch(url,options);
  Logger.log(response)

在这里遗漏了什么?

编辑:已经尝试使用有效载荷。

解决方法

我相信你的目标如下。

  • 您想将以下 Node.js 脚本转换为 Google Apps 脚本。

      const fetch = require('node-fetch');
      const URL = "https://login.XXXXXXXXXXXXX.com.br/api/login"
    
      fetch(URL,{
        "body": "{'my_json_data': 'login data'}","method": "POST",}).then(res => res.text())
        .then(body => console.log(JSON.parse(body)));
    

修改点:

  • 在您的 Node.js 脚本中,"{'my_json_data': 'login data'}" 的数据作为 data 发送到 text/plain。所以在这种情况下,在使用 UrlFetchApp 时,需要设置内容类型。因为当未设置内容类型时,数据将作为 form-data 发送。

当以上几点反映到你的脚本中时,它变成如下。

修改后的脚本:

从:
var options = {
  method: 'POST',payload: JSON.stringify(data)
}
到:
var options = {
  method: 'POST',payload: JSON.stringify(data),contentType: "text/plain"
}
  • 如果 contentType: "text/plain" 发生错误,请将其修改为 contentType: "text/plain;charset=UTF-8"
  • 虽然我不确定您的 API 的规范,但我认为 contentType: "application/json" 也可以使用。但这是我的猜测。

参考: