POST-запрос ReactJS axios отправляет все параметры как один ключ JSON с пустым значением

#php #reactjs #ionic-framework #axios #codeigniter-4

#php #reactjs #ionic-framework #axios #codeigniter-4

Вопрос:

Я использую ReactJS во внешнем интерфейсе и делаю POST-запрос на серверную часть CodeIgniter4.

Мой внешний вызов выглядит следующим образом —

 axios.post('http://localhost/exampleApiEndpoint', { sample_key: 'sample_value' })
    .then(response => {
        // Do something
    })
  

Если я выполню следующий код —

 $this->request->getPost('sample_key');
  

Я ожидаю, что он вернет ‘sample_value’, но я получаю null

Поэтому я решил запустить следующий код в CI4, чтобы посмотреть, что происходит в фоновом режиме

 $this->request->getRawInput()
  

он возвращает {{"hello":"world"}: ""}

И, конечно же, когда я запускаю $this->request->getPost('{"hello":"world"}'); , он выдает мне пустую строку (не null, а пустую строку)

Я новичок в обеих платформах. Я не совсем уверен, как действовать дальше с этого момента. Я использовал следующий фрагмент в качестве обходного пути, который работает до тех пор, пока во входных данных нет символов. Если они есть, они преобразуются в подчеркивание. Что далеко от идеала.

 $raw_input = $this->request->getRawInput();
$json_input = json_decode(array_key_first($raw_input));
  

Ответ №1:

Axios отправляет данные в формате тела JSON при отправке данных в API. Для того, чтобы вы могли отправлять данные в виде POST, вы должны использовать FormData API.

 let formData = new FormData();
formData.append('sample_key','sample_value');
  

Чем отправлять этот объект FormData вместо объекта Javascript, который вы отправляете:

 axios.post('http://localhost/exampleApiEndpoint', formData)
    .then(response => {
        // Do something
    })
  

В контроллере CI4 вы можете получить свои данные, выполнив следующие действия :

 $data = $this->request->getPost();
  

Ссылка: https://developer.mozilla.org/en-US/docs/Web/API/FormData

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

1. Спасибо за решение. Это работает для меня. Хотя я все равно предпочел бы отправлять данные в формате json. Но это работает так же хорошо 🙂

2. Да, это удобнее, но нет способа опубликовать данные, передав JSON напрямую (по крайней мере, насколько мне известно).

Ответ №2:

Создайте объект данных таким образом, а затем передайте этот объект в post-запрос.

 let data = {sample_key: "sample_value"}

axios.post('http://localhost/exampleApiEndpoint', data)
.then(response => {
    // Do something
})
  

Спасибо

Ответ №3:

Клиент axios отправляет запрос с Content-Type заголовком application/json и как необработанный входной поток полезной нагрузки JSON.

Используйте CodeIgniter HTTP IncomingRequest::getJSON, чтобы захватить этот поток из тела запроса и проанализировать его как JSON объект.

 $json = $this->request->getJSON();

// Access sample_key field from object
$json->sample_key;
  

Вы также можете разобрать тело запроса в ассоциативный массив, передав true для первого параметра.

 $json = $this->request->getJSON(true);

// Access 'sample_key' key in array
$json['sample_key'];
  

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

1. Мне действительно нравится это решение. Выглядит очень элегантно, но у меня это не работает. $this->request->getJSON(); возвращает значение null.

2. @AlienSteak Он должен вернуть отправленную полезную нагрузку. Мне потребовалось некоторое время, чтобы настроить эксперимент