#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 Он должен вернуть отправленную полезную нагрузку. Мне потребовалось некоторое время, чтобы настроить эксперимент