Axios добавляет дополнительную косую черту в основных значениях

#javascript #node.js #react-native #axios #escaping

#javascript #node.js #react-native #axios #экранирование

Вопрос:

Я разрабатываю приложение с React Native, которое взаимодействует с чипом IoT (с очень небольшим объемом оперативной памяти), поэтому вся логика должна быть разработана на стороне клиента.

Одна из спецификаций этого чипа — все символы «,» должны быть экранированы только одной косой чертой.

Пример:

От:

 { value: 'foo,bar' }
 

Для:

 { value: 'foo,bar' }
 

Я отправляю эту информацию с помощью axios:

 import axios from 'axios';

const body = { value: 'foo,bar' };
const parsedBody = { value: body.value.replace(/,/g, '\,') } // { value: 'foo,bar' }

axios({
  method: 'POST',
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json; charset=utf-8',
  },
  url: 'https://example.com',
  data: body,
}).then(response => {
  console.log('message sent!');
});
 

Проблема в том, что с другой стороны, сервер получает тело (как объект) с дополнительной косой чертой

Пример:

 { value: 'foo\,bar' }
 

Я не уверен, что информация изменяется axios. Но мне нужно получить его только с одной косой чертой (я не могу разобрать его на стороне сервера)

Комментарии:

1. Скорее всего, вы неправильно интерпретируете результат, и функция, которую вы используете для проверки значения, добавляет escape-символ просто как способ представления строки. Нам нужно было бы увидеть код на стороне сервера, чтобы сказать.

2. Во внешнем интерфейсе: body.value.split(‘,’).join(‘,’), чтобы преобразовать его в соответствующий формат и посмотреть результат. Здесь сначала преобразуется строка в массив на основе ‘,’, а затем массив преобразуется в строку с использованием ‘,’

3. @Quentin Это было первое, о чем я подумал. Но я создал тестовый сервер, чтобы увидеть результаты, и в ответе есть дополнительный символ, когда я проверяю длину строки

4. @RohitDalal Я получил тот же результат при таком подходе

Ответ №1:

Поскольку вы передаете объект как data , я сильно предполагаю, что axios использует JSON.stringify() для преобразования этого объекта в строку. Правильное представление объекта в формате JSON { value: 'foo\,bar' } {"value":"foo\,bar"} , поэтому с двойными кавычками и двойной обратной косой чертой.

Теперь я не знаком с axios, и его документация, похоже, не очень подробная, но, возможно, попробуйте передать строку как data . Тогда у вас есть полный контроль над тем, как он кодируется.

Очень простой способ попробовать это было бы data: JSON.stringify(parsedBody).replace(/\\,/g, '\,') .
Это, очевидно, не сработает, если вы когда-нибудь намеренно захотите отправить \, вместо , . Поэтому в зависимости от того, какие данные вы планируете отправлять, вам может потребоваться реализовать собственную функцию stringification (например: data: `{ value: '${body.value.replace(/([',\])/g, '\$1')}' }` )