Угловой 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

506   9  

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()), Javascript encodeURIComponent() должны сделать трюк для вас.

Я делаю это на стороне сервера, в начале моего 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 })

затем добавьте следующий код $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';
});

Угловой 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

    Ничего не найдено.