节点HTTPS请求 - MalformedJsonException

时间:2017-04-14 21:29:40

标签: node.js

我正在尝试使用node / HTTPS发出POST请求,但我一直收到此错误:

  

BODY:{“message”:“MalformedJsonException:   com.google.gson.stream.MalformedJsonException:使用   JsonReader.setLenient(true)接受第1行的格式错误的JSON   11路径$“,”mdcKey“:”“}

以下是启动请求的代码:

  const https = require('https');

  const querystring = require('querystring');

  const POSTData = querystring.stringify({
    'addressTo': 'myemail@address.com',
    'subject': 'testing your email template',
    'templateName': 'genericTemplate',
    'bodyText': 'this is a test'
  });

  console.log(POSTData);

  const HTTPOptions = {
    hostname: 'url.com',
    port: 00000,
    path: '/path',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    }
  };

  const HTTPSrequest = https.request(HTTPOptions, (response) => {
    console.log(`STATUS: ${res.statusCode}`);
    console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
    response.setEncoding('utf8');
    response.on('data', (chunk) => {
      console.log(`BODY: ${chunk}`);
    });
    response.on('end', () => {
      console.log('No more data in response.');
    });
  });

  HTTPSrequest.on('error', (error) => {
    console.log(`problem with request: ${error}`);
  });

  // write data to request body
  HTTPSrequest.write(POSTData);
  HTTPSrequest.end();

我假设POSTData是“格式错误的JSON”,这就是字符串化的样子:

  

addressTo =名称%40companyname.com&安培受试者=测试%20your%20email%20template&安培; TEMPLATENAME = genericTemplate&安培; bodyText的=此%图20是%20A%20test

我不确定我在做什么导致格式错误的JSON。我错过了什么?

3 个答案:

答案 0 :(得分:2)

您正在发送application/x-www-form-urlencoded个有效负载,但告诉服务器它是application/json。由于这种不匹配,服务器正在抱怨。

简单的解决方案应该是将querystring.stringify更改为JSON.stringify

您可能还需要指定Content-Length标头,因为某些服务器可能不支持分块请求(这是节点中的默认值)。如果你确实添加了这个,请确保使用Buffer.byteLength(POSTData)作为标题值,而不仅仅是POSTData.length,因为前者适用于多字节字符,后者则返回字符数(不是字节)。 / p>

答案 1 :(得分:1)

有关@mscdex

的详细说明,请提供更多帮助

querystring.stringify返回后的选项对象。否则,您不会知道字符串化正文数据的length

请务必注意,您的选项对象中需要两个额外的标头才能成功发布请求。这些是:

'Content-Type': 'application/json',
'Content-Length': POSTData.length

检查示例:

  const HTTPOptions = {
    hostname: 'url.com',
    port: 00000,
    path: '/path',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',          
      'Content-Length': POSTData.length
    }
  };

你也可以看到这个例子:1st post

答案 2 :(得分:-1)

JsonReader.setLenient(true) 在第 1 行第 11 列接受格式错误的 JSON 路径 $","mdcKey":""}