Угловой HTTP-пост на PHP и неопределенный
у меня есть форма с тегом ng-submit="login()
функция вызывается нормально в javascript.
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 неопределены. Это все php у меня есть
<?php
$email = $_POST['email'];
$pass = $_POST['password'];
echo $email;
?>
любая идея, почему я получаю значение undefined POST значения?
EDIT
Я хотел бы отметить, так как это, кажется, популярный вопрос (пока он старый),.success и .error были осуждены, и вы должны использовать .then как указал @James Gentes в commments
9 ответов:
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()), JavascriptencodeURIComponent()должны сделать трюк для вас.
Я делаю это на стороне сервера, в начале моего init-файла, работает как шарм, и вам не нужно ничего делать в угловом или существующем php-коде:
if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST)) $_POST = json_decode(file_get_contents('php://input'), true);
в 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, который отправляет данные post с типом контента по умолчанию: application / x-www-form-urlencoded или Content-Type: application/json, API ответит без ошибок и сделает API немного более дружелюбен к разработчикам.
надеюсь, что это помогает.
потому что PHP изначально не принимает JSON
'application/json'один из подходов заключается в обновлении заголовков и параметров из angular, чтобы ваш api мог напрямую использовать данные.первый, Параметризуйте свои данные:
data: $.param({ "foo": $scope.fooValue })затем добавьте следующий код
$httpheaders: { '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'; });
Угловой 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); ?>из-за углового поведения нет прямого метода для нормального поведения post на PHP-сервере, поэтому вы должны управлять им в объектах json.
перед передачей данных формы в качестве второго параметра необходимо десериализовать их .пост.)( Вы можете добиться этого с помощью jQuery это $.метод param (data). Тогда вы сможете на стороне сервера ссылаться на него, как $.POST ['email'];
Это лучшее решение (IMO), поскольку оно не требует jQuery и декодирования JSON:
источник: https://wordpress.stackexchange.com/a/179373 и: https://stackoverflow.com/a/1714899/196507
резюме:
//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"]; ?>
Это старый вопрос, но стоит отметить, что в Angular 1.4 $httpParamSerializer добавляется и при использовании $http.post, если мы используем $httpParamSerializer (params) для передачи параметров, все работает как обычный запрос post, и на стороне сервера не требуется десериализация JSON.
https://docs.angularjs.org/api/ng/service/$httpParamSerializer
мне потребовалось несколько часов, чтобы понять это при работе с Angular и PHP. Post data не собирался 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"); }); });
Comments