Как вы используете XMLHttpRequest с методом POST? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть центральный PHP-скрипт, который я использую для обработки многих запросов со своей страницы, используя вызовы XMLHttpRequest () из JavaScript, используя метод GET.Мой сервер PHP в настоящее время 5.6, и да, я избегаю синхронных вызовов.

Все работает хорошо, однако есть случаи, когда я предпочел бы, чтобы запрос НЕ оставался в истории браузера или даже отображался в URL.Поэтому, основываясь на ссылке MDN на этот вызов, я подумал, что могу просто переключиться на метод POST, сохранив мои существующие запросы (например, "http://myscript.php? Cmd = dothis & data = somedata «).тогда все, что мне нужно сделать, это добавить некоторый код в мой PHP-скрипт, чтобы я мог собрать переданные данные в любом случае ...

if  ($_SERVER['REQUEST_METHOD'] === 'GET') {
    if(isset($_GET['cmd'])) $cmd = $_GET['cmd'];
    if(isset($_GET['data'])) $data =  $_GET['data'];  
    }

if  ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if(isset($_POST['cmd'])) $cmd = $_POST['cmd'];
    if(isset($_POST['data'])) $data =  $_POST['data'];  
    }

Ну, очевидно, я был совершенно неправ.Я обнаружил, что ...

  1. Ни одна из переменных, показанных в этом примере, не видна сценарием в массиве $ _POST, когда я переключаюсь на метод POST.
  2. Переключениеиз массива $ _POST в массив $ _REQUEST работает нормально (например: "if (isset ($ _ REQUEST ['cmd'])) $ cmd = $ _REQUEST ['cmd']);"), НО ....
  3. Само выполнение моих вызовов XMLHttpRequest () с помощью метода POST приводит к таким ошибкам в моем журнале:

PHPУстаревшее: автоматическое заполнение $ HTTP_RAW_POST_DATA устарело и будет удалено в следующей версии.Чтобы избежать этого предупреждения, установите «always_populate_raw_post_data» на «-1» в php.ini и используйте вместо этого поток ввода php: //.в Unknown в строке 0

Так что, очевидно, это тупик.Делая все возможное, чтобы исследовать, что происходит здесь, в справочнике PHP по POST я прочитал это прямо сверху ...

$ _ POST $ HTTP_POST_VARS [устарело]

Поэтому, если я правильно понимаю, причина, по которой я могу получить только переменные POST с помощью массива $ _REQUEST, заключается в том, что мои запросы по-прежнему отформатированы так, как если бы я все еще использовал GET, что (очевидно?) является устаревшим методом.Поэтому «уговорить» его на работу - это просто перенести проблему в будущее.

Между прочим, я могу видеть, вызвав phpinfo.php на моем сервере, что, несмотря на ОШИБКУ, которую я вижу в моих журналах, «always_populate_raw_post_data» действительно уже имеет значение «-1».Таким образом, все «решения», которые я нашел, рекомендовавшие мне «ПРОСТО» сделать эту настройку в моем файле PHP.INI, не помогают.

И даже если он «скрыл» ошибку, это не имеет значения длямне.Я ошибаюсь, говоря, что даже если я просто соберу мои переданные переменные PHP из массива $ _REQUEST при использовании метода POST, И придумаю способ подавления «устаревших» предупреждений в моем LOG, вся схема все равно развалится (и заставляет мои запросы POST терпеть неудачу), день, когда я наконец-то мигрирую на PHP 7.x.?

Я прошу прощения за вопрос здесь, но я действительно пытался найти все ссылки, которые я мог найти для выполнения XMLHttpRequests, используя POSTметод и устаревшие сообщения об ошибках, которые я получаю в своих журналах.Существует так много устаревшей информации, что я не могу найти никакого четкого обсуждения того, как ПРАВИЛЬНО изменить или переформатировать мои запросы XMLHttpRequest, чтобы я мог использовать метод POST.На самом деле, я даже не могу точно определить, будет ли это возможно за пределами PHP.5.6.Буду очень признателен за любую помощь.

1 Ответ

1 голос
/ 01 июля 2019

PHP допустил ошибку, назвав $_GET и $_POST после места по умолчанию, в котором веб-браузер помещает данные в HTML-форму, где атрибуту method присвоено значение GET или POST.

$_GET получает данные из строки запроса, даже если метод запроса был POST.

Тело запроса определяется аргументом, который вы передаете send. Данные, которые вы вводите в строку запроса, остаются в строке запроса.

const url = 'http://myscript.php'
const form_data = new FormData();
form_data.append("cmd", "dothis");
form_data.append("data", "somedata");
cost xhr = new XMLHttpRequest;
xhr.open("POST", url);
xhr.addEventListener('load', function () { console.log(this.response); });
xhr.send(form_data);
...