Отправляйте данные JSON на PHP с помощью XMLHttpRequest без jQuery


Я пытаюсь отправить данные JSON из формы, используя объект XMLHttpRequest. Я могу отправить данные, используя следующую функцию. В FireBug нет ошибок, и JSON-данные в запросе отображаются правильно сформированными FireBug.

Тем не менее, я отправляю данные в echo.php , что просто возвращает содержимое:

<?php
print_r($_POST);
print_r($_GET);
foreach (getallheaders() as $name => $value) {
    echo "$name: $value\n";
}
echo file_get_contents('php://input');
?>

Пост-массив всегда пуст, но я вижу строку JSON, возвращаемую file_get_contents. Как это происходит? Что я делаю неправильно?

Выход из echo.php

Array
(
)
Array
(
)
Host: localhost
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: eo,de-de;q=0.8,de;q=0.6,en-us;q=0.4,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Referer: http://localhost/form.html
Content-Length: 88
Cookie: {{..to much data..}}
Pragma: no-cache
Cache-Control: no-cache
{"type":"my_type","comment":"commented"}

Функция отправки:

function submit(){
    var data={};
    data.type=document.form.type.value;
    data.comment=document.form.comment.value;

    //get right XMLHttpRequest object for current browsrer
    var x=ajaxFunction();

    var string = JSON.stringify(data);

    x.open('POST','echo.php',true);
    x.setRequestHeader('Content-type','application/json; charset=utf-8');
    x.setRequestHeader("Content-length", string.length);
    x.setRequestHeader("Connection", "close");

    x.onreadystatechange = function(){
        if (x.readyState != 4) return;
        if (x.status != 200 && x.status != 304) {
            alert('HTTP error ' + req.status);
            return;
        }

        data.resp = JSON.parse(x.responseText);
        if(data.resp.status=='success'){
            alert('That worked!');
        }else{
            alert('That didn\'t work!');
        }
    }
    x.send(string);

    return false; //prevent native form submit
}
Author: Simon, 2012-03-01

2 answers

Вы забыли назвать свои переменные в функции отправки. Хороший способ использовать его -

x.send('name1='+string+'&name2=value2'); 

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

Еще одна вещь, которую вы можете сделать, это попробовать использовать метод GET. Вы также можете попробовать изменить заголовок типа содержимого следующим образом:

xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
 7
Author: artragis, 2013-08-27 08:23:42

PHP не обрабатывает запросы JSON автоматически, как это происходит с запросами в кодировке формы или составными запросами. Если вы хотите использовать JSON для отправки запросов на PHP, вы в основном делаете это правильно с помощью file_get_contents(). Если вы хотите объединить эти переменные в свой глобальный объект $_POST, вы можете, хотя я бы не рекомендовал этого делать, так как это может сбить с толку других разработчиков.

// it's safe to overwrite the $_POST if the content-type is application/json
// because the $_POST var will be empty
$headers = getallheaders();
if ($headers["Content-Type"] == "application/json")
    $_POST = json_decode(file_get_contents("php://input"), true) ?: [];

Краткое примечание: вы не должны отправлять кодировку с вашим типом контента для приложение/json. Это должно быть отправлено только с текстовыми/* Типами контента.

 5
Author: rich remer, 2016-06-13 02:47:31