Google apps脚本UrlFetchApp和nodejs axios返回不同的结果;我的健身伙伴日记

问题描述 投票:0回答:1

我正在尝试从 MyFitnessPal 获取我的日记,我本机编写了以下有效的代码:

"use strict";
const axios = require('axios')

async function getReport(username) {
  const foodLog = await axios({
    method: 'POST',
    url: `https://www.myfitnesspal.com/api/services/authenticate_diary_key/${username}`,
    data: {
      from: "2023-01-20",
      to: "2023-01-30",
      show_food_diary: 1,
      show_exercise_diary: 1,
      show_food_notes: 0,
      show_exercise_notes: 0,
      key: ""
    }
  })

  // do stuff with foodLog
}

响应包含一系列日期,每个日期包含膳食等。

但是,当我向 MyFitnessPal 发出完全相同的请求,但在使用 UrlFetchApp 的 google apps 脚本内时,我得到一个空响应:

function getReport(username) {
  const url = `https://www.myfitnesspal.com/api/services/authenticate_diary_key/${username}`
  const payload = {
      from: "2023-01-20",
      to: "2023-01-30",
      show_food_diary: 1,
      show_exercise_diary: 1,
      show_food_notes: 0,
      show_exercise_notes: 0,
      key: ""
    }
  
  const options = {
    payload,
    method: 'post'
  }

  try {
    const response = UrlFetchApp.fetch(url,options)
    console.log(response.getResponseCode()) //200
    console.log(response.getContentText()) // []
  } catch (error){
    console.log(error)
  }
}

请求通过,没有出现状态 200 的错误,但我得到一个空数组作为响应。我是不是错过了什么?

您可以通过将您的 MyFitnessPal 用户名传递给 getReport() 来轻松复制该错误,但请确保日记共享设置为“公开”并且您已记录所选日期的膳食。

node.js http google-apps-script axios http-post
1个回答
0
投票

我相信您的目标如下。

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

修改要点:

  • 当我看到您显示的node.js脚本时,似乎请求正文以JSON形式发送,其中
    Content-Type
    application/json
    。另一方面,当我看到您显示 Google Apps 脚本时,似乎请求正文作为表单数据发送。这可能是您当前问题的原因。

当这些点反映在您显示的 Google Apps 脚本中时,以下修改如何?

来自:

const options = {
  payload,
  method: 'post'
}

致:

const options = {
  payload: JSON.stringify(payload),
  method: 'post',
  contentType: "application/json"
}

注:

  • 如果出现错误,请在请求头中包含
    Accept: "application/json, text/plain, */*"
    并再次测试。

参考:

© www.soinside.com 2019 - 2024. All rights reserved.