在API调用上获取无效的JSON

时间:2018-03-21 16:28:48

标签: javascript json api express

我正在尝试使用GoToMeeting的API并发出POST请求来创建会议。目前,我只是试图硬编码会议的主体并发送标题,但我收到了,我是无效的JSON错误,不知道为什么。这是该路线的代码:

app.post('/new-meeting', (req, res) => {

  const headers = {
    'Content-Type': 'application/json',
    Accept: 'application / json',
    Authorization: 'OAuth oauth_token=' + originalToken
  };

  console.log('-----------------------------------------------------------')
  console.log('Acess Token:');
  console.log('OAuth oauth_token=' + originalToken);
  console.log('-----------------------------------------------------------')

  const meetingBody = {
    subject: 'string',
    starttime: '2018-03-20T08:15:30-05:00',
    endtime: '2018-03-20T09:15:30-05:00',
    passwordrequired: true,
    conferencecallinfo: 'string',
    timezonekey: 'string',
    meetingtype: 'immediate'
  };

  return fetch('https://api.getgo.com/G2M/rest/meetings', {
    method: 'POST',
    body: meetingBody,
    headers: headers
  }).then(response => {

    console.log('response:');
    console.log(response);


    response
      .json()
      .then(json => {
        res.send(json);
        console.log(req.headers);
      })
      .catch(err => {
        console.log(err);
      });
  });
});

当我点击该路由器时,出现以下错误:

{
  "error": {
    "resource": "/rest/meetings",
    "message": "invalid json"
  }
}

任何建议都将不胜感激!

2 个答案:

答案 0 :(得分:2)

TL;博士

您正在传递fetch JavaScript对象所代表的body的值。它通过(隐式)调用其.toString()方法将其转换为字符串。这不会给你JSON。您正在调用的API会抱怨并告诉您它不是JSON。

您需要使用以下命令将对象转换为JSON:

body: JSON.stringify(meetingBody), 

测试用例

这证明了问题和解决方案。

服务器

这是GoToMeeting API的一个非常原始和不完整的模拟。它只是回应了请求机构。

const express = require("express");
var app = express();
var bodyParser = require('body-parser');

app.use(bodyParser.text({ type: "*/*" }));

app.post("/", (req, res) => {
    console.log(req.body);
    res.send(req.body)
});

app.listen(7070, () => console.log('Example app listening on port 7070!'))

客户端

这表示您的代码,但Express服务器已被删除。只保留与向GoToMeeting API发送请求相关的代码。

const url = "http://localhost:7070/";
const fetch = require("node-fetch");

const headers = {
    'Content-Type': 'application/json',
    Accept: 'application / json',
    Authorization: 'OAuth oauth_token=foobarbaz'
};

const meetingBody = {
    subject: 'string',
    starttime: '2018-03-20T08:15:30-05:00',
    endtime: '2018-03-20T09:15:30-05:00',
    passwordrequired: true,
    conferencecallinfo: 'string',
    timezonekey: 'string',
    meetingtype: 'immediate'
};


fetch(url, {
        method: 'POST',
        body: meetingBody,
        headers: headers
    })
    .then(res => res.text())
    .then(body => console.log(body));

运行测试用例的结果

服务器和客户端的日志显示:

[object Object] 

这是您致电meetingBody.toString()时获得的。

如果按照本答案顶部的描述更改代码,则会得到:

{"subject":"string","starttime":"2018-03-20T08:15:30-05:00","endtime":"2018-03-20T09:15:30-05:00","passwordrequired":true,"conferencecallinfo":"string","timezonekey":"string","meetingtype":"immediate"}

这是JSON,这是API所期望的。

除了

MIME类型中没有空格。 Accept: 'application / json',应为Accept: 'application/json',。这个可能不会给你带来任何问题。

答案 1 :(得分:0)

我认为标题不正确。

你需要'Accept:application / json'没有空格。