UrlFetchApp Google Scripts VS Node Fetch

Posted

技术标签:

【中文标题】UrlFetchApp Google Scripts VS Node Fetch【英文标题】: 【发布时间】:2021-04-10 11:58:49 【问题描述】:

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

此代码在带有 node-fetch lib 的 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)

我在这里错过了什么?

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

【问题讨论】:

【参考方案1】:

我相信你的目标如下。

您希望将以下 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'" 的数据作为text/plain 发送到data。所以在这种情况下,当使用 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" 可能也可以使用。但这是我的猜测。

参考:

Class UrlFetchApp

【讨论】:

以上是关于UrlFetchApp Google Scripts VS Node Fetch的主要内容,如果未能解决你的问题,请参考以下文章

在 Google 脚本中: UrlFetchApp.fetch(''https://accounts.spotify.com/api/token'') 返回代码 405

UrlFetchApp Google Scripts VS Node Fetch

如何在 Google Apps 脚本中向 UrlFetchApp 添加 API 密钥

Discord API 告诉我:“401:未经授权”,当我使用 Google 脚本进行 GET 时:“UrlFetchApp.fetch()”

如何在 Google Apps 脚本中使用 UrlFetchApp 发出 Drive API 批处理请求

如何在谷歌工作区插件中使用 UrlFetchApp.fetchAll 和日历 API