Я пытался передать JSON скрипту PHP в AngularJS, например:
var testObj = {
answers : {
aa : 2,
ab : 3
}
};
var userAnswers = angular.toJson(testObj.answers);
$http.post("ajax/testAddObject.php?answers=" + userAnswers).
success(function(data){
console.log("Result: ", data);
});
На стороне PHP я делал следующее:
//... new PDO connection to DB
$answers = $_POST['answers'];
//some more stuff
Параметр $answers
всегда был пустым. Но потом, почти случайным образом, я увидел этот вопрос, и ответ сказал:
$_POST
будет пустым, еслиContent-Type: application/json
передается в заголовках
И хотя мой код не был таким же, как и вопрос, я сменил $_POST[...]
на $_GET[...]
на PHP-код, и он сработает! Вопрос в том, почему? В чем разница между собой? Потому что, из того, что я видел, кажется, нет большой разницы...
$http.post("ajax/testAddObject.php?answers=" + userAnswers).
Здесь вы отправляете answers
как параметры запроса (GET) на testAddObject.php
и не отправляете их (POST) - обратите внимание на ?
параметр в конце testAddObject.php
-
Данные $ _GET передаются как параметры в URL-адресе. $ _POST - нет.
$_POST
заполняется данными из тела запроса HTTP, если эти данные будут отформатированы с использованием одного из многоголосных или URL-закодированные форматы.
$_GET
заполняется данными из части строки запроса URL-адреса.
$_GET
будет заполнен, даже если запрос не был запросом GET. Это касается только того, было ли это в строке запроса или нет.
Поскольку он был поднят в комментариях. $_REQUEST
содержит данные из $_POST
и данные из $_GET
и данные из $_COOKIES
. Обычно его лучше избегать, так как это позволяет удивляться данным, поступающим из мест, которые вы не ожидаете.
$_REQUEST
нет?
$_GET
. $_REQUEST
отличается.
Я углубился в проблему, и я нашел эту статью, которая объясняет, что этот вид является функцией "AngularJS".
По умолчанию angular.js отправляет все данные в json. Поэтому, если вы выполняете
POST
запрос к PHP-коду,$_POST
не будет заполнено.
Хотя мой код был не совсем прав, если я изменю клиентскую сторону:
$http.post("ajax/testAddObject.php?", {answers : userAnswers}) //...
и соответственно изменить PHP, $_POST[...]
все равно ничего не возвращает, что имеет смысл сейчас.
Согласно той же статье есть два решения: один на стороне клиента и другой на стороне сервера
На сервере вы можете анализировать ввод и затем декодировать данные из json:
$data = file_get_contents("php://input"); $postData = json_decode($data);'
На стороне клиента данные могут быть отправлены так, как это ожидает PHP:
$http({ url:url data : $.param(data), method : 'POST', headers : {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'} }).success(callback);
posted
а добавляется в URL. Вы знаете это, и я тоже.