PHP और अपरिभाषित के लिए AngularJS HTTP पोस्ट


107

मेरे पास टैग के साथ एक फॉर्म है ng-submit="login()

जावास्क्रिप्ट में फ़ंक्शन को ठीक कहा जाता है।

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 फ़ाइल से एक 200 ठीक प्रतिक्रिया वापस हो रही है, हालांकि, दिए गए डेटा कह रही है कि emailऔर passwordअपरिभाषित कर रहे हैं। यह सभी php मेरे पास है

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

कोई भी विचार मुझे अपरिभाषित POSTमान क्यों मिल रहा है ?

संपादित करें

मैं यह इंगित करना चाहता था क्योंकि यह एक लोकप्रिय प्रश्न लगता है (फिर भी यह पुराना है), .successऔर .errorपदावनत कर दिया गया है और आपको .then@ जेंट्स जेंट्स के रूप में उपयोग करना चाहिए


2
क्या आपने अपने डेवलपर टूल के नेटवर्क टैब को देखा? में क्या मूल्य पारित किया है $http?
मार्सेल कोर्पल

1
नेटवर्क टैब में, इसके तहत Form-Dataकहता है{"email":"fsdg@sdf.com","password":"1234"}
रॉनी

@ रॉनी जैसन की तरह लगता है। कोशिश करें print_r($_POST);और फिर json_decode()सही सूचकांक पर कोशिश करें
हमजा

1
echo 'test';ठीक काम करता है। मैं निश्चित रूप से सही फ़ाइल की ओर इशारा कर रहा हूं
रॉनी

1
ध्यान दें कि .success और .err को पदावनत और बदल दिया गया है। इसके बाद ( docs.angularjs.org/api/ng/service/$http )
20

जवाबों:


228

angularjs .post()सामग्री-प्रकार के हेडर को डिफॉल्ट करता है application/json। फ़ॉर्म-एन्कोड किए गए डेटा को पास करने के लिए आप इसे ओवरराइड कर रहे हैं, हालाँकि आप dataएक उपयुक्त क्वेरी स्ट्रिंग को पारित करने के लिए अपना मान नहीं बदल रहे हैं , इसलिए PHP $_POSTआपकी अपेक्षा के अनुरूप नहीं है।

मेरा सुझाव सिर्फ application/jsonहेडर के रूप में डिफ़ॉल्ट एंगुलरज सेटिंग का उपयोग करना होगा , PHP में कच्चे इनपुट को पढ़ना होगा, और फिर JSON को डीसर्विलाइज़ करना होगा ।

इस तरह PHP में प्राप्त किया जा सकता है:

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

वैकल्पिक रूप से, यदि आप $_POSTकार्यक्षमता पर बहुत अधिक निर्भर हैं, तो आप email=someemail@email.com&password=somepasswordडेटा के रूप में एक क्वेरी स्ट्रिंग बना सकते हैं और उसे भेज सकते हैं। सुनिश्चित करें कि यह क्वेरी स्ट्रिंग URL एनकोडेड है। यदि मैन्युअल रूप से बनाया गया है (जैसा कि कुछ का उपयोग करने के विपरीत jQuery.serialize()), तो जावास्क्रिप्ट encodeURIComponent()को आपके लिए चाल चलनी चाहिए।


7
अपने ज्ञान का अनादर नहीं कर रहे हैं, लेकिन file_get_contents("php://input");एक हैक की तरह का उपयोग कर लगता है, नहीं? मैंने ऐसा कभी नहीं सुना। ऐसा होने की जरूरत है तो मैं इसे सिर्फ संदर्भ दे सकता हूं$_POST['email'];
रोनी

6
@ रॉनी यह हैक नहीं है। यह वास्तव में इस बात पर निर्भर करता है कि आप अपनी वेब सेवा कैसे सेट करना चाहते हैं। यदि आप JSON को भेजना और प्राप्त करना चाहते हैं, तो आपको कच्चे इनपुट के साथ काम करने की आवश्यकता है क्योंकि $_POSTआबादी नहीं होगी।
माइक ब्रैंट

1
@lepe मेरे लिए यह स्पष्ट नहीं है कि जुड़ा हुआ प्रश्न / उत्तर मेरे उत्तर से कैसे संबंधित है। यहाँ एक जावास्क्रिप्ट ऑब्जेक्ट को क्रमांकित करने की आवश्यकता की कोई चर्चा नहीं है।
माइक ब्रैंट

2
@lascort वास्तव में समाधान के लिए वास्तव में बहुत अंतर नहीं है। मेरे समाधान में, मैं $ _POST में डेटा को पॉप्युलेट नहीं कर रहा हूं, इसके बजाय उपयोगकर्ता-परिभाषित चर को प्राथमिकता दे रहा हूं। सामान्य तौर पर, यह मेरे लिए और अधिक समझ में आता है कि JSON-serialized डेटा के साथ काम करते समय, आप wth ऑब्जेक्ट्स या संख्यात्मक रूप से अनुक्रमित सरणियों पर काम कर सकते हैं। मैं $ _POST में संख्यात्मक रूप से अनुक्रमित सरणी जोड़ने का सुझाव नहीं दूंगा, क्योंकि यह एक atypical उपयोग होगा। मैं आम तौर पर इनपुट डेटा के लिए उपयोग किए जाने वाले किसी भी सुपरग्लोब में डेटा डालने से कतराता हूं।
माइक ब्रैंट

1
@ItsmeJulian कोई पूर्ण सही उत्तर नहीं है। यह वास्तव में इस बात पर निर्भर हो सकता है कि आपका आवेदन कैसे है। यदि आपका JSON का उपभोग / वितरण करने वाली REST सेवा के साथ बातचीत कर रहा है, तो मैं संभवतः JSON सामग्री प्रकार के साथ चिपका रहूंगा। अगर मैं बड़े पैमाने पर एक एंडपॉइंट के साथ काम कर रहा था, तो HTML या HTML टुकड़े का उत्पादन कर सकता हूं या AJAX के लिए बैकबैक के रूप में मूल रूप में पोस्टिंग का उपयोग करता हूं, तो मुझे फॉर्म एन्कोडिंग के साथ छड़ी करने की इच्छा हो सकती है।
माइक ब्रैंट

41

मैं इसे सर्वर की तरफ से करता हूं, मेरी इनिट फाइल की शुरुआत पर, एक आकर्षण की तरह काम करता है और आपको कोणीय या मौजूदा php कोड में कुछ भी करने की जरूरत नहीं है:

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

3
आप इस मामले में अपने परिणाम डाली चाहिए $ _POST खाली है: $_POST = (array) json_decode(file_get_contents('php://input'), true)
Mieur Toph '

मैं वास्तव में नहीं मिलता है क्यों PHP लोग इसे खुद को लागू नहीं किया, वे वास्तव में हमेशा url- एन्कोडेड पोस्ट की उम्मीद करते हैं ??
अजराफती

@ मुझे लगता है कि क्यों नहीं किसी को उम्मीद है कि PHP करने की उम्मीद है। यह हर समय कम से कम-आश्चर्य के सिद्धांत का उल्लंघन करता है।
doug65536 12

यह एक बहुत ही नाजुक दृष्टिकोण की तरह लगता है जब तक कि आप पूरी तरह से नहीं जानते हैं कि POSTed डेटा एक सहयोगी सरणी (JSON में ऑब्जेक्ट प्रतिनिधित्व) का प्रतिनिधित्व करता है। क्या होगा अगर JSON में संख्यात्मक रूप से अनुक्रमित सरणी प्रतिनिधित्व होता है? $_POSTइस मामले में एक संख्यात्मक रूप से अनुक्रमित सरणी प्राप्त करने का अंत होगा, कुछ ऐसा जो सिस्टम के अन्य भाग में बहुत अप्रत्याशित व्यवहार होगा जो लगातार $_POSTसुपरग्लोबल व्यवहार पर निर्भर करता है।
माइक ब्रैंट

1
मैं केवल कोणीय संचालित अनुप्रयोगों में, निश्चित रूप से इसका उपयोग करता हूं, और मैं अपने POST डेटा को बहुत अच्छी तरह से मान्य करता हूं, यह नहीं देखता कि यह कैसे समस्या हो सकती है ...
21

14

एपीआई में मैं विकसित कर रहा हूं मेरे पास एक आधार नियंत्रक है और इसके अंदर __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));
}

यह मुझे केवल जरूरत पड़ने पर $ _POST ["var"] के रूप में json डेटा को संदर्भित करने की अनुमति देता है। बहुत अच्छा काम करता है।

इस तरह से यदि कोई प्रमाणित उपयोगकर्ता किसी लाइब्रेरी के साथ जुड़ता है तो ऐसा jQuery जो सामग्री-प्रकार के डिफ़ॉल्ट के साथ पोस्ट डेटा भेजता है: अनुप्रयोग / x-www-form-urlencoded या सामग्री-प्रकार: अनुप्रयोग / json एपीआई त्रुटि और इच्छा के बिना प्रतिक्रिया देगा। एपीआई को थोड़ा और डेवलपर के अनुकूल बनाएं।

उम्मीद है की यह मदद करेगा।


11

क्योंकि PHP मूल रूप से JSON को स्वीकार नहीं करता है, 'application/json'एक दृष्टिकोण को अपने हेडर और मापदंडों को कोणीय से अद्यतन करना है ताकि आपके एपीआई सीधे डेटा का उपयोग कर सकें।

सबसे पहले , अपने डेटा को परिमित करें:

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

8

कोणीय जेएस डेमो कोड: -

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

?>

कोणीय व्यवहार के कारण PHP सर्वर पर सामान्य पोस्ट व्यवहार के लिए कोई प्रत्यक्ष विधि नहीं है, इसलिए आपको इसे ज्सन ऑब्जेक्ट्स में प्रबंधित करना होगा।


1
यह गलत है। ऊपर दिए गए उत्तर देखें जहां JSON सीधे PHP कच्चे इनपुट से पढ़ा जाता है। यह JSON को क्वेरी स्ट्रिंग में मिलाने की तुलना में बहुत अधिक सरल है।
माइक ब्रैंट

.successऔर .errorतरीकों का बहिष्कार कर रहे हैं और AngularJS ढांचे से हटा दिया गया है।
georgeawg

6

.Post () के दूसरे पैरामीटर के रूप में इसे पास करने से पहले आपको अपने फॉर्म डेटा को डिसेर्बलाइज करना होगा। आप इसे jQuery की $ .param (डेटा) विधि का उपयोग करके प्राप्त कर सकते हैं। तब आप इसे $ .POST ['ईमेल'] की तरह संदर्भित करने के लिए सर्वर की ओर सक्षम होंगे;


6

यह सबसे अच्छा समाधान (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"];
?>

किस बारे में: JSON.stringify('{ id: 'some_id', name : 'some_name' }')या $httpParamSerializerक्लाइंट-साइड रूपांतरण के लिए?
qrtLs

5

यह एक पुराना प्रश्न है, लेकिन यह उल्लेख के लायक है कि कोणीय 1.4 $ httpParamSerializer में जोड़ा गया है और $ http.post का उपयोग करते समय, यदि हम मापदंडों को पारित करने के लिए $ httpParamSerializer (params) का उपयोग करते हैं, तो सब कुछ एक नियमित पोस्ट अनुरोध की तरह काम करता है और कोई JSON deserializing नहीं है सर्वर की जरूरत है।

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


1

मुझे यह समझने में घंटों लग गए कि कोणीय और पीएचपी के साथ काम करते समय। पोस्ट डेटा $ _POST में PHP में नहीं जा रहा था

PHP कोड में निम्नलिखित करते हैं। - एक चर $ angular_post_params बनाएं - फिर निम्न कार्य करें $angular_http_params = (array)json_decode(trim(file_get_contents('php://input')));

अब आप अपने मापदंडों का उपयोग कर सकते हैं जैसे आप $ _POST से करते हैं

$angular_http_params["key"]

मामले में आप जावास्क्रिप्ट के बारे में सोच रहे थे .... यह वही है जो मैंने इस्तेमाल किया

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

newbies के लिए ... पेज पर अपने कंटेंट होल्डर कंटेनर में जोड़े गए एनजी-ऐप और एनजी कंट्रोलर निर्देशों को न भूलें :)
Talha

.successऔर .errorतरीकों का बहिष्कार कर रहे हैं और AngularJS ढांचे से हटा दिया गया है।
जार्जिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.