我正在尝试从 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() 来轻松复制该错误,但请确保日记共享设置为“公开”并且您已记录所选日期的膳食。
我相信您的目标如下。
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, */*"
并再次测试。