Получение сообщения не работает с json api, закодированным с помощью codeIgniter. Метод get работает, но есть проблема в методе post. Ключ не распознается между реагирующим родным и воспламенителем кода. Любая помощь приветствуется. Спасибо
fetch('http://zzz.com/login', {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
username: 'abc',
}),
})
.then(response => response.json())
.then(responseJson => {
console.info('responseJson', responseJson);
})
.catch((error) => {
console.error('fetchError', error);
});
Контроллер CodeIgniter
public function login()
{
$un = $this->input->post('username'); //why doesn't the key 'username' is working here
echo json_encode($un);
}
ЖУРНАЛ КОНСОЛИ:
responseJson false
Обновления:
1) Использование json_decode дает ошибку "fetchError SyntaxError: Неожиданный конец ввода JSON"
public function login()
{
$Data = json_decode(file_get_contents('php://input'), false);
echo $Data;
}
2) Использование json_encode дает следующие результаты: responseJson {"имя пользователя": "abc"}
public function login()
{
$Data = json_encode(file_get_contents('php://input'), false);
echo $Data;
}
1) Использование только file_get_contents дает результат как: responseJson {username: "abc"}
public function login()
{
$Data = (file_get_contents('php://input'));
echo $Data;
}
2) использование var_dump и json_decode в коде сервера дает следующую ошибку в консоли приложения
public function login()
{
$Data = json_decode(file_get_contents('php://input'), true);
var_dump ($Data);
}
Ошибка:
fetchError SyntaxError: Unexpected token a in JSON at position 0
at parse (<anonymous>)
at tryCallOne (E:\zzz\node_modules\promise\setimmediate\core.js:37)
at E:\zzz\node_modules\promise\setimmediate\core.js:123
at E:\zzz\node_modules\react-native\Libraries\Core\Timers\JSTimers.js:295
at _callTimer (E:\zzz\node_modules\react-native\Libraries\Core\Timers\JSTimers.js:152)
at _callImmediatesPass (E:\zzz\node_modules\react-native\Libraries\Core\Timers\JSTimers.js:200)
at Object.callImmediates (E:\zzz\node_modules\react-native\Libraries\Core\Timers\JSTimers.js:464)
at MessageQueue.__callImmediates (E:\zzz\node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:320)
at E:\zzz\node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:135
at MessageQueue.__guard (E:\zzz\node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:297)
console регистрирует ответ, как показано ниже, дает массив в консоли приложения:
fetch('http://zzz.com/login', {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
username: 'abc',
})
})
.then((response) => console.info('response', response))
Консоль:
response
Response {type: "default", status: 200, ok: true, statusText: undefined, headers: Headers, …}
headers:Headers {map: {…}}
ok:true
status:200
statusText:undefined
type:"default"
url:"http://zzz.com/login"
_bodyInit:"array(1) {↵ ["username"]=>↵ string(3) "abc"↵}↵"
_bodyText:"array(1) {↵ ["username"]=>↵ string(3) "abc"↵}↵"
__proto__:Object
Скорее всего, нет, поэтому вам, возможно, придется прочитать необработанный поток, используя что-то вроде json_decode(file_get_contents('php://input'), true). echo, что в действии входа в систему, чтобы увидеть результат. Я бы также добавил, чтобы дезинфицировать ввод, прежде чем что-либо делать с ним.
@kadeer с использованием эха json_decode ничего не дает, но если я использую $ a = json_encode (file_get_contents ('php: // input'), true); echo $ a; Результатом будет fetchResponsee {"username": "abc"}.
Пожалуйста, ознакомьтесь с обновлениями выше
Привет, извините, я должен был предложить var_dump вместо echo. Если вы получаете сообщение «Неожиданный конец ввода JSON», в действии входа в систему см. Результат этого: file_get_contents('php://input'). Это должно вернуть содержимое POST в необработанном виде. Убедитесь, что вы видите правильный JSON.
Привет, @kadeer, он дает следующий результат: {username: "abc"}. И, пожалуйста, взгляните и на Обновление 1.
Кажется, что сброс file_get_contents('php://input') показывает, что содержимое ввода - это данные, которые вы отправили в значении тела в параметрах AJAX. Вы должны иметь возможность json_decode вводить в действительный массив PHP. До сих пор не работает?





Попробуйте добавить режим same-origin, как показано ниже:
fetch('http://zzz.com/login', {
method: 'POST',
credentials: 'same-origin',
mode: 'same-origin',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
username: 'abc',
}),
})
.then(response => response.json())
.then(responseJson => {
console.info('responseJson', responseJson);
})
.catch((error) => {
console.error('fetchError', error);
});
Боюсь, это не сработало. Пожалуйста, взгляните на обновления выше. Спасибо
Попробуйте отправить данные без json stringify, а затем декодировать тело: {username: 'abc'},
Есть ли у CodeIgniter десериализатор JSON тела запроса?