JSON ошибка синтаксического анализа с топором ios (неожиданный символ в ответе сервера) - PullRequest
0 голосов
/ 17 февраля 2020

Я получаю сообщение об ошибке JSON при попытке извлечь данные из конечной точки сервера.

Впервые Ax ios не может автоматически декодировать ответ JSON.

Отлаживая мой код, я видел, что Ax ios ловит неожиданный символ в ответе сервера, что делает JSON недействительным.

7F5
{
  "message": "OK"
  ...cut
}
0

Ошибка:

(node:14940) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token F in JSON at position 1

Полагаю, это может быть проблемой кодировки кодировки.

Ax ios Конфигурация клиента:

const pclClient = axios.create({
  baseURL: "http://server/endpoint",
  responseType: "json",
  responseEncoding: "utf8",
  headers: {
    Accept: "application/json",
    "Content-Type": "application/json",
    charset: "utf-8"
  }
});

При использовании таких инструментов, как почтальон или Chrome Extension Advanced Request Client, проблема отсутствует.

Может кто-нибудь помочь мне

1 Ответ

0 голосов
/ 18 февраля 2020

Проблема возникает из transfer-encoding: chunked заголовка ответа.

RF C 7230 говорит о том, что «получатель ДОЛЖЕН быть в состоянии проанализировать и декодировать фрагментированный код передачи».

В настоящий момент Ax ios не обрабатывает фрагментированные ответы ( передача-кодирование chunked не обрабатывается для приложения / json)

Чтобы решить эту проблему, я создал анализатор чанка, используя регулярные выражения для удаления информации чанка.

const pclClient = axios.create({
  baseURL: "http://server/",
  responseType: "json",
  headers: {
    Accept: "application/json"
  }
});

const chunksParser = body => {
  return body
    .replace(/^(\w{1,3})\r\n/, "") // replace header chunks info 
    .replace(/\r\n(\w{1,3})\r\n/, "") // replace in-body chunks info
    .replace(/(\r\n0\r\n\r\n)$/, ""); // replace end chunks info
};

const getData = async () => {
  response = await pclClient.get("data.json");
  const { data } = response;
  const body = chunksParser(data);
  const json = JSON.parse(body);
  return json;
};

Я искал встроенную функцию внутри Ax ios. Я надеюсь, что это будет доступно в будущем.

Спасибо за комментарии, которые помогли мне понять, в чем была проблема.

...