Конфигурация PHP, которая удаляет POST из запроса AJAX?

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

У меня есть страница, использующая метод публикации jQuery для отправки запроса AJAX POST в мой API. Они оба находятся в одном домене/сервере.

$.post('api/login.php', {username: 'test', password: 'test'}).done(function (res) {
    alert(res.response);
});

API выглядит так:

<?php
exit (json_encode(array ('response' => print_r($_REQUEST, true))));

Это работает, как и ожидалось, в моей локальной настройке WAMP, но на Bluehost отображается просто Array (), как если бы в запросе не было параметров.

Если я изменю $.post на $.get, он отлично получит оба параметра.

Он также работает должным образом, если я использую HTML-форму и отправляю данные без использования AJAX, например.

<form method="post" action="api/login.php">
    <input type="text" name="username" value="test">
    <input type="text" name="password" value="test">
    <input type="submit">
</form>

Я думаю, что исчерпал тесты, которые я могу создать, чтобы попытаться исключить любую другую возможность, и это просто сводится к чему-то действительно странному - мой PHP-скрипт не получает поля POST в запросе AJAX.


person M Miller    schedule 11.08.2014    source источник
comment
Проверьте консоль разработки вашего браузера, чтобы узнать, регистрирует ли она исключение междоменной безопасности или какую-либо другую ошибку, которая подавляется интерфейсом. Такие ошибки распространены при переходе с локального сервера на удаленный.   -  person acrosman    schedule 11.08.2014
comment
Я в Chrome и не получаю никаких ошибок. Обратите внимание, что .done() срабатывает, что означает, что он получил заголовок 2xx и ответ, который является допустимым объектом JSON. Никаких ошибок консоли, никаких предупреждений/журналов ошибок PHP, просто пустой запрос....   -  person M Miller    schedule 11.08.2014
comment
Настройка $_REQUEST может быть изменена в php.ini с помощью директивы request_order. Попробуйте изменить сценарий на $_POST вместо $_REQUEST и посмотрите, сработает ли это. Я не знаю, поддерживает ли ваш хост пользовательские конфигурации php.ini.   -  person cOle2    schedule 11.08.2014
comment
Я пробовал $_POST до $_REQUEST. Я только что попробовал $_REQUEST, чтобы проверить, работает ли версия $.get.   -  person M Miller    schedule 11.08.2014
comment
Вы проверили в devtools, что параметры действительно были отправлены?   -  person Lorenz Meyer    schedule 11.08.2014
comment
Попробуйте сделать echo json_encode(array('response' => $_POST));   -  person adeneo    schedule 11.08.2014
comment
@lorenz-meyer: Как мне это сделать? @ adeneo: я уже сделал это, см. мой предыдущий комментарий.   -  person M Miller    schedule 11.08.2014
comment
открытие ссылки с такими параметрами, как: api/login.php?username=aa&password=bb работает как положено при использовании $_REQUEST ? В противном случае Jquery может быть ошибкой.   -  person ion    schedule 11.08.2014
comment
@MMiller - вы пробовали именно так, без print_r посередине?   -  person adeneo    schedule 11.08.2014
comment
Вы просматриваете детали запроса на вкладке сети инструментов разработчика Chrome или Firefox.   -  person Lorenz Meyer    schedule 11.08.2014
comment
@adeneo почему так долго? почему бы не просто print_r($_POST);?   -  person Sebastien    schedule 12.08.2014
comment
Я вижу отскок 301. Может ли это быть ответственным? Я бы подумал, что запрос POST будет перенаправлен с отказом, особенно если учесть, что его не следует рассматривать иначе, чем традиционный запрос (не XMLHttpRequest).   -  person M Miller    schedule 12.08.2014
comment
Почему бы не связать метод fail с запросом ajax и посмотреть, выдает ли он   -  person adeneo    schedule 12.08.2014
comment
Это происходит не потому, что вызывается done. Два эксклюзива. Я получаю ответ, в нем просто нет полей.   -  person M Miller    schedule 12.08.2014
comment
Тогда попробуйте что-нибудь попроще, просто echo "hello" и посмотрите, получится ли у вас это.   -  person adeneo    schedule 12.08.2014
comment
Ладно, ты не понимаешь проблемы. request работает нормально и возвращает правильный ответ, но request не отправляет корректные значения POST.   -  person M Miller    schedule 12.08.2014
comment
Так что это работает, если вы возвращаете что-то еще, только не $_POST, и это работает, если вы отправляете запрос POST с обычной формой и на локальном хосте с ajax, но не с ajax на Bluehost. Звучит маловероятно, но я полагаю, что все, что вы действительно можете сделать, это связаться с Bluehost и спросить, что они делают.   -  person adeneo    schedule 12.08.2014
comment
Интересно, что, похоже, проблема в том, что у хостинг-аккаунта нет домена. box###.bluehost.com/~USERNAME не работал, но DOMAIN.com (несмотря на то, что нигде в коде не было абсолютных URL-адресов — на самом деле, я даже не решил, еще домен).   -  person M Miller    schedule 12.08.2014
comment
@MMiller, можешь попробовать echo json_encode(array('response' => file_get_contents(php://input)));   -  person Aivar    schedule 12.08.2014


Ответы (1)


Поскольку сервер может получать значения сообщений из HTML. Может возникнуть проблема с методом публикации jQuery. Поэтому вместо сообщения jQuery вы можете попробовать функцию ajax для публикации данных. Замените следующую функцию и посмотрите, работает ли она.

$.ajax({
type: "POST",
url: "api/login.php",
   data: { username: 'test', password: 'test' }
})
.done(function( res ) {
   alert(res.response);
});
person Community    schedule 16.08.2014
comment
Если вы прочитаете исходный код jQuery, вы увидите, что $.post делает именно это. Как ни странно, это была проблема, связанная с отсутствием домена, значит, это должно быть что-то странное в конфигурации сервера (поскольку все пути резолвились правильно и ошибок, связанных с происхождением, не было). - person M Miller; 17.08.2014