AngularJS HTTP пост на PHP и неопределенный
У меня есть форма с тегом ng-submit="login()
Функция получает в javascript функцию fine.
function LoginForm($scope, $http)
{
$http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
$scope.email = "[email protected]";
$scope.password = "1234";
$scope.login = function()
{
data = {
'email' : $scope.email,
'password' : $scope.password
};
$http.post('resources/curl.php', data)
.success(function(data, status, headers, config)
{
console.log(status + ' - ' + data);
})
.error(function(data, status, headers, config)
{
console.log('error');
});
}
}
Я получаю ответ 200 OK из файла PHP, однако возвращенные данные говорят, что email
и password
являются undefined. Это все php, у меня есть
<?php
$email = $_POST['email'];
$pass = $_POST['password'];
echo $email;
?>
Любая идея, почему я получаю значения undefined POST
?
ИЗМЕНИТЬ
Я хотел бы указать, так как это кажется популярным вопросом (но он старый), .success
и .error
устарели, и вы должны использовать .then
, как @James Gentes, указанную в коммандах
Ответы
Ответ 1
angularjs .post()
присваивает заголовку Content-type значение application/json
. Вы переопределяете это, чтобы передавать данные, закодированные в форме, однако вы не изменяете значение data
для передачи соответствующей строки запроса, поэтому PHP не заполняет $_POST
, как вы ожидаете.
Мое предложение состояло в том, чтобы просто использовать параметр angularjs по умолчанию для application/json
как заголовок, прочитать исходный ввод в PHP и затем десериализовать JSON.
Это может быть достигнуто в PHP следующим образом:
$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
$email = $request->email;
$pass = $request->password;
В качестве альтернативы, если вы в значительной степени полагаетесь на функциональность $_POST
, вы можете сформировать строку запроса, например [email protected]&password=somepassword
, и отправить ее как данные. Убедитесь, что эта строка запроса закодирована в URL. Если вы создали вручную (в отличие от использования чего-то вроде jQuery.serialize()
), Javascript encodeURIComponent()
должен сделать трюк для вас.
Ответ 2
Я делаю это на стороне сервера, в начале моего файла инициализации, работает как шарм, и вам не нужно ничего делать в angular или существующем php-коде:
if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST))
$_POST = json_decode(file_get_contents('php://input'), true);
Ответ 3
В API, который я разрабатываю, у меня есть базовый контроллер и внутри его метода __construct() у меня есть следующее:
if(isset($_SERVER["CONTENT_TYPE"]) && strpos($_SERVER["CONTENT_TYPE"], "application/json") !== false) {
$_POST = array_merge($_POST, (array) json_decode(trim(file_get_contents('php://input')), true));
}
Это позволяет мне просто ссылаться на данные json как $_POST [ "var" ], когда это необходимо. Прекрасно работает.
Таким образом, если аутентифицированный пользователь подключается к библиотеке, такой как jQuery, который отправляет почтовые данные по умолчанию Content-Type: application/x-www-form-urlencoded или Content-Type: application/json, API будет отвечать без и сделает API немного более удобным для разработчиков.
Надеюсь, что это поможет.
Ответ 4
Потому что PHP не принимает JSON 'application/json'
. Один из подходов - обновить заголовки и параметры от angular, чтобы ваш api мог напрямую использовать данные.
Сначала. Параметрируйте свои данные:
data: $.param({ "foo": $scope.fooValue })
Затем добавьте следующее в свой $http
headers: {
'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
},
Если все ваши запросы отправляются на PHP, параметры могут быть установлены глобально в конфигурации следующим образом:
myApp.config(function($httpProvider) {
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
});
Ответ 5
Angular Js Демо-код: -
angular.module('ModuleName',[]).controller('main', ['$http', function($http){
var formData = { password: 'test pwd', email : 'test email' };
var postData = 'myData='+JSON.stringify(formData);
$http({
method : 'POST',
url : 'resources/curl.php',
data: postData,
headers : {'Content-Type': 'application/x-www-form-urlencoded'}
}).success(function(res){
console.log(res);
}).error(function(error){
console.log(error);
});
}]);
Код сервера: -
<?php
// it will print whole json string, which you access after json_decocde in php
$myData = json_decode($_POST['myData']);
print_r($myData);
?>
Из-за поведения angular нет прямого метода для нормального поведения почты на сервере PHP, поэтому вам нужно управлять им в объектах json.
Ответ 6
Вам необходимо десериализовать данные формы, прежде чем передавать его как второй параметр в .post(). Вы можете добиться этого, используя метод jQuery $.param(data).
Тогда вы сможете на стороне сервера ссылаться на него как $.POST ['email'];
Ответ 7
Это лучшее решение (IMO), поскольку оно не требует jQuery и не декодирует JSON:
Источник:
https://wordpress.stackexchange.com/a/179373
и: fooobar.com/questions/14302/...
Резюме:
//Replacement of jQuery.param
var serialize = function(obj, prefix) {
var str = [];
for(var p in obj) {
if (obj.hasOwnProperty(p)) {
var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
str.push(typeof v == "object" ?
serialize(v, k) :
encodeURIComponent(k) + "=" + encodeURIComponent(v));
}
}
return str.join("&");
};
//Your AngularJS application:
var app = angular.module('foo', []);
app.config(function ($httpProvider) {
// send all requests payload as query string
$httpProvider.defaults.transformRequest = function(data){
if (data === undefined) {
return data;
}
return serialize(data);
};
// set all post requests content type
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
});
Пример:
...
var data = { id: 'some_id', name : 'some_name' };
$http.post(my_php_url,data).success(function(data){
// It works!
}).error(function() {
// :(
});
PHP-код:
<?php
$id = $_POST["id"];
?>
Ответ 8
Это старый вопрос, но стоит упомянуть, что в Angular 1,4 $httpParamSerializer добавляется и при использовании $http.post, если мы используем $httpParamSerializer (params) для передачи параметров, все работает как обычный почтовый запрос и десериализация JSON не требуется на стороне сервера.
https://docs.angularjs.org/api/ng/service/$httpParamSerializer
Ответ 9
Мне потребовалось несколько часов, чтобы понять, что при работе с Angular и PHP.
Почтовые данные не отправлялись на PHP в $_POST
в PHP-коде выполните следующие действия.
- Создать переменную $angular_post_params
- Затем сделайте следующее
$angular_http_params = (array)json_decode(trim(file_get_contents('php://input')));
теперь вы можете получить доступ к своим параметрам, например, из $_POST
$angular_http_params["key"]
в случае, если вам интересно о javascript.... это то, что я использовал
var myApp = angular.module('appUsers', []);
//var post_params = $.param({ request_type: "getListOfUsersWithRolesInfo" });
var dataObj = {
task_to_perform: 'getListOfUsersWithRolesInfo'
};
myApp.controller('ctrlListOfUsers', function ($scope, $http) {
$http({
method: 'POST',
dataType: 'json',
url: ajax_processor_url,
headers: {
'Content-Type': 'application/json'
},
data: dataObj,
//transformRequest: function(){},
timeout: 30000,
cache: false
}).
success(function (rsp) {
console.log("success");
console.log(rsp);
}).
error(function (rsp) {
console.log("error");
});
});