Soru PHP ve undefined için açısal HTTP yayını


Etiketi olan bir formum var ng-submit="login()

Javascript işlevi iyi olarak adlandırılır.

function LoginForm($scope, $http)
{
    $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';

    $scope.email    = "fsdg@sdf.com";
    $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');
        });
    }
}

PHP dosyasından 200 ok geri yanıt alıyorum, ancak iade edilen veri email ve password tanımlanmamış. Bu benim bütün php'm

<?php
$email = $_POST['email'];
$pass  = $_POST['password'];
echo $email;
?>

Neden undefined alıyorum herhangi bir fikir POST değerler?

DÜZENLE

Bu popüler bir soru gibi göründüğünden işaret etmek istedim (henüz eski), .success ve .error kullanımdan kaldırıldı ve kullanmalısınız .then @James Gentes, komisyonlarda belirtildiği gibi


98
2018-03-18 19:35


Menşei


Geliştirici araçlarınızın ağ sekmesine baktınız mı? Hangi değer geçiyor? $http? - Marcel Korpel
Ağ sekmesinde Form-Data diyor ki {"email":"fsdg@sdf.com","password":"1234"} - Ronnie
@Ronnie JSON gibi görünüyor. Deneyin print_r($_POST); ve sonra dene json_decode() doğru endekste - HamZa
JQuery'den gelen veriler normalde nasıl POST vereceğim. Az önce denedim print_r($_POST); ve ben var array() - Ronnie
echo 'test'; iyi çalışıyor. Kesinlikle doğru dosyaya işaret ediyorum - Ronnie


Cevaplar:


angularjs .post() İçerik türü üstbilgisini varsayılan olarak application/json. Form kodlu verileri geçmek için bunu geçersiz kılıyorsunuz, ancak siz data uygun bir sorgu dizesini geçirecek değer, bu yüzden PHP doldurmuyor $_POST beklediğiniz gibi.

Benim önerim sadece varsayılan angularjs ayarını kullanmak olurdu application/json başlık olarak, PHP'de ham girişi okuyun ve ardından JSON'u seri hale getirin.

PHP'de bu şekilde elde edilebilir:

$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
$email = $request->email;
$pass = $request->password;

Alternatif olarak, eğer ağır bir şekilde güveniyorsanız $_POST işlevsellik gibi bir sorgu dizesi oluşturabilir email=someemail@email.com&password=somepassword ve bunu veri olarak gönder. Bu sorgu dizesinin URL’nin kodlanmış olduğundan emin olun. Eğer el ile oluşturulmuşsa ( jQuery.serialize()), Javascript encodeURIComponent() senin için hile yapmalısın.


213
2018-03-18 19:54



Bilginize saygısızlık etmemekle birlikte file_get_contents("php://input"); Bir kesmek gibi görünüyor, değil mi? Bunu hiç duymadım. Ne olması gerekiyor ki ben sadece ona benzeyebilirim $_POST['email']; - Ronnie
@Ronnie Bu bir kesmek değil. Web servisinizi nasıl kurmak istediğinize bağlı. JSON'u göndermek ve almak istiyorsanız, ham giriş ile çalışmanız gerekir. $_POST doldurulmayacak. - Mike Brant
@lepe Bağlantılı soru / cevabın cevabımla nasıl bağlantılı olduğu bana açık değil. Burada bir javascript nesnesini serileştirmeye ihtiyaç duyulmayacak bir tartışma yoktur. - Mike Brant
@lascort gerçekten çözümlerde gerçekten çok fazla bir fark yoktur. Çözümümde, verileri $ _POST alanına yerleştirmiyorum, bunun yerine kullanıcı tanımlı bir değişken tercih ediyorum. Genel olarak, bu, JSON serileştirilmiş verilerle çalışırken, wth nesneleri veya sayısal olarak dizilmiş diziler çalışıyor olabilirsiniz. Sayısal olarak indeksli bir diziyi $ _POST'a eklemenizi tavsiye etmeyeceğim, çünkü bu bir atipik kullanım olacaktır. Ayrıca, veriyi giriş verileri için kullanılan süper küresellerden herhangi birine sokmaktan genellikle utanıyorum. - Mike Brant
@ItsmeJulian mutlak bir doğru cevap yoktur. Uygulamanızın nasıl yapılandırıldığına bağlı olabilir. JSON'u tüketen / dağıtan bir REST hizmeti ile etkileşim halindeyseniz, muhtemelen JSON içerik türüne bağlı kalacağım. Büyük ölçüde bir uç nokta ile çalışıyor olsaydım, HTML veya HTML parçaları üretebilir veya AJAX'a geri dönüş olarak temel form gönderme özelliğini kullanırsa, form kodlamasıyla uğraşmaya meyilli olabilirim. - Mike Brant


Bunu sunucu tarafında yapıyorum, init dosyamın başlangıcında, bir çekicilik gibi çalışıyor ve açısal veya mevcut bir php kodunda hiçbir şey yapmak zorunda değilsiniz:

if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST))
    $_POST = json_decode(file_get_contents('php://input'), true);

37
2018-06-10 12:25



sonucunuzu $ _POST'un boş olması durumunda vermeniz gerekir: $_POST = (array) json_decode(file_get_contents('php://input'), true). - M'sieur Toph'
PHP adamlarının bunu neden uygulamadığını gerçekten anlamıyorum, Gerçekten her zaman URL kodlanmış mesajlar beklerler mi? - azerafati
@Bludream Neden kimse bekleneni yapmak için PHP bekliyoruz anlamıyorum. Her zaman en az sürpriz ilkesini ihlal ediyor. - doug65536
Bu, POSTed verilerin bir ilişkisel diziyi (JSON'ta bir nesne temsili) temsil ettiğini kesinlikle bilmediğiniz sürece çok hassas bir yaklaşım gibi görünüyor. JSON sayısal olarak indeksli dizi gösterimi içeriyorsa ne olur? $_POST Bu durumda sayısal olarak endeksli bir dizi elde etmek, sistemin diğer tarafında tutarlı olmayan güvende beklenmeyen davranış olacak bir şey olur $_POST süper küresel davranış. - Mike Brant
Bunu sadece açısal enerjili uygulamalarda kullanıyorum ve POST verilerini çok iyi bir şekilde doğrularım, bunun nasıl bir sorun olduğunu görmüyorum ... - valmarv


Geliştirdiğim API'da bir temel denetleyicim var ve __construct () yönteminin içinde aşağıdakilere sahibim:

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));
}

Bu, gerektiğinde json verilerini $ _POST ["var"] olarak göndermeme izin verir. Harika çalışıyor.

Bu şekilde, kimliği doğrulanmış bir kullanıcı, bir Content-Type: application / x-www-form-urlencoded veya Content-Type: application / json varsayılanı ile posta gönderen bir jQuery gibi bir kitaplığa bağlanırsa, API hatasız yanıt verir ve API'yi biraz daha geliştirici dostu yapın.

Bu yardımcı olur umarım.


12
2018-05-22 14:56





Çünkü PHP doğal olarak JSON'u kabul etmiyor 'application/json' Bir yaklaşım, üstbilgilerinizi ve parametrelerinizi açısal olarak güncellemektir, böylece api'niz verileri doğrudan kullanabilir.

İlk, Verilerinizi parametrelendirin:

data: $.param({ "foo": $scope.fooValue })

Sonra, aşağıdakine ekleyin $http

 headers: {
     'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
 }, 

Tüm istekleriniz PHP'ye giderse, parametreler aşağıdaki gibi konfigürasyonda global olarak ayarlanabilir:

myApp.config(function($httpProvider) {
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
});

10
2018-05-22 19:01





Açısal Js Demo Kodu: -

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);
        });

        }]);

Sunucu Yan Kodu: -

<?php


// it will print whole json string, which you access after json_decocde in php
$myData = json_decode($_POST['myData']);
print_r($myData);

?>

Açısal davranış nedeniyle PHP sunucusunda normal post davranışları için doğrudan bir yöntem yoktur, bu yüzden json nesnelerini yönetmeniz gerekir.


9
2018-06-27 06:46



Bu yanlış. JSON'un doğrudan PHP ham girişinden okuduğu yukarıdaki yanıtlara bakın. Bu, JSON'u sorgu dizesine karıştırmaktan çok daha kolaydır. - Mike Brant


Form verilerinizi, ikinci parametre olarak .post () olarak iletmeden önce serileştirmeniz gerekir. Bunu jQuery'nin $ .param (data) yöntemini kullanarak yapabilirsiniz. Ardından sunucu tarafında $ .POST ['email'];


6
2018-03-18 00:02





Bu, jQuery gerektirmediği ve JSON kod çözme gerektirmediği için en iyi çözümdür (IMO):

Kaynak: https://wordpress.stackexchange.com/a/179373ve: https://stackoverflow.com/a/1714899/196507

Özet:

//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';
});

Örnek:

...
   var data = { id: 'some_id', name : 'some_name' };
   $http.post(my_php_url,data).success(function(data){
        // It works!
   }).error(function() {
        // :(
   });

PHP kodu:

<?php
    $id = $_POST["id"];
?>

6
2018-03-11 14:31



Ne dersin: JSON.stringify('{ id: 'some_id', name : 'some_name' }') veya $httpParamSerializer istemci tarafı dönüşüm için? - ItsmeJulian


Bu eski bir soru ama angular 1.4 $ httpParamSerializer eklenir ve $ http.post kullanırken, parametreler geçmek için $ httpParamSerializer (params) kullanırsak, her şey normal bir posta isteği gibi çalışır ve hiçbir JSON serileştirme olduğunu belirtmeye değer Sunucu tarafında gerekli.

https://docs.angularjs.org/api/ng/service/$httpParamSerializer


5
2018-06-17 02:34





Angular ve PHP ile çalışırken bunu anlamak saatlerimi aldı. Veriler, $ _POST’ta PHP’ye gitmiyordu

PHP kodunda aşağıdakileri yapın. - Değişken $ angular_post_params oluşturun - O zaman aşağıdakileri yapın $angular_http_params = (array)json_decode(trim(file_get_contents('php://input')));

şimdi $ _POST'dan yaptığınız gibi parametrelerinize erişebilirsiniz.

$angular_http_params["key"]

javascript hakkında merak ediyorsanız .... bu ne kullanılır

    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");
        });
    });

0
2017-07-14 08:04



Yeni başlayanlar için ... ng-app ve ng-controller direktiflerini sayfanızdaki içerik tutucu kabına eklediğini unutmayın :) - Talha