Неожиданный токен в JSON для специальных символов - PullRequest
0 голосов
/ 09 января 2019

Почему я получаю SyntaxError: Unexpected token < in JSON at position 0 при попытке отправить запрос post, содержащий символы body, например или ?

Вот так я отправляю запрос (в качестве примера я добавил жестко закодированное тело):

import request from 'request';

export default {
  postScriptRequest(body) {
    return new Promise((resolve, reject) => {
      const options = {
        'method': 'post',
        'body': JSON.stringify({
          "text": "Sending – instead of - and ’ instead of ' returns Unexpected token in JSON"
        }),
        'headers': {
          'Content-Length': JSON.stringify(body).length
        },
        'url': 'my-url.com'
      }
      request(options, (error, response, body) => {
        if(response.statusCode == 200) {
          resolve(body);
        }
        else {
          reject(response.statusCode);
        }
      });
    });
  }
}

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Возможно, вам потребуется указать (в качестве заголовка)

"Content-type": "application/json; charset=UTF-8"

и вычислите правильную длину содержимого, поскольку длина строки javscript не обязательно равна длине в байтах, требуемой значением содержимого:

Вы можете рассчитать длину содержимого на основе чего-то вроде:

"1こ3?".split('').reduce((a,c,i)=>a+c.charCodeAt(0).toString("16").length/2,0)

Но я не уверен, как это вычисление длины байта сравнивается с другими решениями .

0 голосов
/ 09 января 2019

Один простой способ проверить, имеет ли проблема длину, - использовать вместо этого буфер. То есть:

let buffer = new Buffer(JSON.stringify(...));

// use buffer.length instead of string length
// pass buffer.toString() as the body

(длина буфера будет корректно иметь общую длину байтов сообщения, а не символов .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...