#codeigniter #fetch
#codeigniter #выборка
Вопрос:
Я делаю запрос post, используя выборку в моем проекте codeigniter. Запрос выглядит следующим образом
fetch('myurl/mycontroller', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
testdata: 123,
})
}).then((res) => {
console.log(res);
}).catch(console.log);
Мой контроллер выглядит следующим образом
class MyController extends CI_Controller
{
public function mycontroller()
{
$data = $this->input->post('testdata');
return $data . " is the passed data.";
}
}
Но данные не передаются на мой контроллер. Я повторил, $_POST
и это дало мне пустой массив. Есть идеи, что я делаю не так? Я использую codeigniter 2 (который, как я знаю, сейчас очень старый)
Комментарии:
1. Можете ли вы опубликовать весь свой контроллер?
2. это весь мой контроллер. Я только что запустил тест и не смог получить данные для публикации
3. Я давно не использовал codeigniter 2. Но я уверен, что контроллер должен быть классом, а не просто функцией.
4. о, я понимаю, что вы имеете в виду, но это функция в контроллере
5. Я не уверен, что проблема здесь в codeigniter-2 или в вашем javascript. Когда вы используете тот же javascript для отправки в новый php-файл, который имеет только print_r($ _POST), это что-нибудь дает?
Ответ №1:
Так что не совсем уверен в фактической причине, но может быть какая-то ошибка с ядром CI codeigniter, которое не анализирует данные, передаваемые контроллеру с помощью выборки. Используя FormData()
и axios
я смог решить проблему.
var postData = new FormData();
postData.append('testdata', 123);
axios.post('myurl/mycontroller', postData).then(function(response){
console.log("success:", response);
}).catch(function(error){
console.log("error:", error);
});
Ответ №2:
Используйте FormData()
для отправки
var postData = new FormData();
postData.append('testdata', 123);
fetch('myurl/mycontroller', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: postData
}).then((res) => {
console.log(res);
}).catch(console.log);
Комментарии:
1. Я попробовал это решение и получил тот же результат. Данные не передаются. повторение $_POST по-прежнему является пустым массивом
2. попробуйте это на контроллере
$input = json_decode(trim(file_get_contents('php://input')), true); $data = $input['testdata']
и используйте свою выборку3. я смог решить эту проблему, используя axios вместо выборки
4. @justinS не могли бы вы опубликовать решение, чтобы кто-нибудь мог найти его позже?
Ответ №3:
Это сработало для меня:
let postData = new FormData();
postData.append('testdata', 123);
fetch('myurl/mycontroller', {
method: 'POST',
mode: 'no-cors',
headers: {
"Content-Type": "application/json"
},
body: postData
}).then((res) => {
console.log(res);
}).catch(console.log);
Используйте formData
и mode: 'no-cors'
в настройках выборки.
Комментарии:
1. Спасибо за ваш ответ. Можете ли вы сказать мне, какую версию Codeigniter вы используете? Тот, над которым я работал, был Codeigniter 2 (я знаю устаревшую версию), но для Codeigniter 2 он не может правильно отформатировать данные post, чтобы серверная часть могла их правильно прочитать. Добавление режима не имело никакого значения.
2. привет @ JustinS, в настоящее время я использую CI v3.1.11. В контроллере, который я использую
$this->input->post()
для получения данных. Разница может быть в версии.3. Эта комбинация сработала для меня после нескольких часов ломки головы! Забавно, что я постоянно использую CI 3.1, но это простой PHP-скрипт. Итак, два за один!
Ответ №4:
У меня была аналогичная проблема, позже я исправил ее, не переходя от выборки js. Вот как я это решил.
- Убедитесь, что в вашем файле маршрутизации есть маршрут Post к вашему контроллеру CI
- Убедитесь, что ваш URL-адрес fetch api не имеет завершающего ‘/’
let data = await fetch('https://example.com/api/login', {
method: 'POST',
credentials: 'same-origin',
mode: 'same-origin',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({email: 'sample@gmail.com', password: 'crypt887faked'}),
});
let response = await data.json();
Это сработало для меня. Я надеюсь, что это сработает и для кого-то.