কৌণিক জেএস এইচটিটিপি পিএইচপি এবং অপরিজ্ঞাত পোস্ট


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

আমি পিএইচপি ফাইল থেকে একটি 200 ওকে প্রতিক্রিয়া পাচ্ছি, তবে, ফিরে আসা ডেটা বলছে emailএবং passwordঅপরিজ্ঞাত। এই আমার সব পিএইচপি

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

কোন ধারণা কেন আমি অপরিজ্ঞাত POSTমান পাচ্ছি ?

সম্পাদনা

আমি এটি উল্লেখ করতে চেয়েছিলাম যেহেতু এটি একটি জনপ্রিয় প্রশ্ন বলে মনে হচ্ছে (তবে এটি পুরানো), .successএবং অবহেলা করা .errorহয়েছে এবং আপনাকে .then@ জেমস জেন্টস কমেন্টে নির্দেশিত হিসাবে ব্যবহার করা উচিত


2
আপনি কি আপনার বিকাশকারী সরঞ্জামগুলির নেটওয়ার্ক ট্যাবটি দেখেছেন? কোন মান পাস হয় $http?
মার্সেল করপেল

1
নেটওয়ার্ক ট্যাবে, এর অধীনে Form-Dataবলা হয়েছে{"email":"fsdg@sdf.com","password":"1234"}
রনি

@ রনি JSON এর মতো মনে হচ্ছে। চেষ্টা করুন print_r($_POST);এবং তারপরে json_decode()ডান সূচকটি ব্যবহার করে দেখুন
হামজা

1
echo 'test';ঠিকভাবে কাজ করে. আমি অবশ্যই সঠিক ফাইলটির দিকে ইঙ্গিত করছি
রনি

1
মনে রাখবেন .success এবং .error কে অবচয় ও প্রতিস্থাপন করা হয়েছে। থিথন ( docs.angularjs.org/api/ng/service/$http )
জেমস

উত্তর:


228

কৌণিক বিষয়গুলি .post()সামগ্রী-প্রকারের শিরোনামকে ডিফল্ট করে application/json। আপনি ফর্ম-এনকোডড ডেটা পাস করার জন্য এটি ওভাররাইড করছেন, তবে আপনি dataকোনও উপযুক্ত ক্যোয়ারী স্ট্রিং পাস করার জন্য নিজের মান পরিবর্তন করছেন না , তাই পিএইচপি $_POSTআপনার প্রত্যাশা অনুযায়ী পপুলেশন করছে না ।

আমার পরামর্শটি হ'ল application/jsonহেডার হিসাবে ডিফল্ট কৌণিক সেটিংটি ব্যবহার করা , পিএইচপি-তে কাঁচা ইনপুট পড়ুন এবং তারপরে জেএসওনকে deserialize করুন।

এটি পিএইচপি তে এভাবে অর্জন করা যায়:

$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
@ লিপ লিঙ্কিত প্রশ্ন / উত্তর আমার উত্তরের সাথে কীভাবে সম্পর্কিত তা আমার কাছে পরিষ্কার নয়। এখানে একটি জাভাস্ক্রিপ্ট অবজেক্ট সিরিয়াল করার প্রয়োজন নেই আলোচনা।
মাইক ব্রেন্ট

2
@ ল্যাসকোর্টে সমাধানের ক্ষেত্রে সত্যিই তেমন কোনও পার্থক্য নেই। আমার সমাধানে, আমি পরিবর্তে কোনও ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবলটিকে প্রাধান্য দিয়ে $ _POST এ ডেটা পপুলেটিং করছি না। সাধারণভাবে, এটি আমার কাছে আরও অনুভূত হয় যে জেএসএন-সিরিয়ালযুক্ত ডেটা নিয়ে কাজ করার সময় আপনি wth অবজেক্টে বা সংখ্যায়-সূচকযুক্ত অ্যারেগুলিতে কাজ করছেন। আমি ally _POST- তে একটি সংখ্যাসূচক-সূচক অ্যারে যুক্ত করার পরামর্শ দেব না, কারণ এটি অ্যান্টিপিকাল ব্যবহার হবে। ইনপুট ডেটার জন্য ব্যবহৃত সুপারগ্লোবালগুলির যে কোনওটিতে ডেটা স্থাপন করা থেকে আমি সাধারণত লজ্জা পাই।
মাইক ব্রেন্ট

1
@IsmeJulian- এর কোনও সঠিক উত্তর নেই। এটি আপনার অ্যাপ্লিকেশনটি কীভাবে আর্কিটেক্ট করা হয়েছে তার উপর নির্ভর করে। যদি আপনি JSON গ্রহন / বিতরণ করে এমন একটি রেস্ট্রের পরিষেবাটির সাথে ইন্টারঅ্যাক্ট করে থাকেন তবে আমি সম্ভবত JSON সামগ্রীর ধরণের সাথে লেগে থাকব। যদি আমি একটি এন্ডপয়েন্টের সাথে বৃহত্তরভাবে কাজ করতাম তবে এটি এইচটিএমএল বা এইচটিএমএল টুকরো তৈরি করতে পারে বা এজেএক্স-এ ফ্যালব্যাক হিসাবে বেসিক ফর্ম পোস্টিং ব্যবহার করতে পারে তবে আমি ফর্ম এনকোডিংয়ের সাথে লেগে থাকতে আগ্রহী হতে পারি।
মাইক ব্রেন্ট

41

আমি সার্ভারের পাশে এটি করি আমার ডিস ফাইলের সূচনাতে, কবজির মতো কাজ করে এবং আপনাকে কৌণিক বা বিদ্যমান পিএইচপি কোডে কিছু করতে হবে না:

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)
এম সিউর তোফ '12

পিএইচপি ছেলেরা কেন এগুলি বাস্তবায়িত করেনি তা আমি সত্যিই পাই না, তারা সত্যই ইউআরএল-এনকোডযুক্ত পোস্টগুলি সর্বদা আশা করে ??
আজেরাফতি

@ ব্লুড্রিম আমি পিএইচপি প্রত্যাশিত যা করতে চাইলে কেন তা পায় না। এটি সর্বদা সর্বনিম্ন-বিস্ময়ের নীতি লঙ্ঘন করে।
দউগ 65536

এটি একেবারে ভঙ্গুর পদ্ধতির মতো বলে মনে হচ্ছে যদি না আপনি অবগত থাকেন যে পোষ্টড ডেটা কোনও এসোসিয়েটিভ অ্যারের প্রতিনিধিত্ব করে (জেএসএন-তে কোনও বস্তুর প্রতিনিধিত্ব করে)। যদি জেএসওএনতে একটি সংখ্যায়-সূচকযুক্ত অ্যারের উপস্থাপনা থাকে তবে কী হবে? $_POSTএই ক্ষেত্রে সংখ্যাসূচকভাবে সূচকযুক্ত অ্যারের সমাপ্তি ঘটবে, এমন কিছু যা সিস্টেমের অন্যান্য অংশগুলিতে খুব অপ্রত্যাশিত আচরণ হবে যা ধারাবাহিক $_POSTসুপারগ্লোবাল আচরণের উপর নির্ভর করে ।
মাইক ব্রেন্ট

1
আমি এটি অবশ্যই কৌণিক চালিত অ্যাপ্লিকেশনগুলিতে ব্যবহার করি অবশ্যই, এবং আমি আমার পোস্টের ডেটাটি খুব ভালভাবে যাচাই করি, দেখুন কীভাবে এটি সমস্যা হতে পারে ...
ভালমার্ভ

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

এটি আমাকে যখন প্রয়োজন হয় তখন সহজভাবে json ডেটা $ _POST ["var"] হিসাবে উল্লেখ করতে দেয়। দুর্দান্ত কাজ করে।

যদি কোনও প্রমাণিত ব্যবহারকারী কোনও লাইব্রেরির সাথে এমন একটি jQuery এর সাথে সংযোগ স্থাপন করে যা কন্টেন্ট-টাইপ: অ্যাপ্লিকেশন / x-www-form-urlencoded বা বিষয়বস্তুর ধরণ: অ্যাপ্লিকেশন / জেএসন কোনও ত্রুটি ছাড়াই প্রতিক্রিয়া জানায় এবং এমনটি করে API কে আরও কিছু বিকাশকারী বান্ধব করে তুলুন।

আশাকরি এটা সাহায্য করবে.


11

কারণ পিএইচপি স্থানীয়ভাবে জেএসএনকে গ্রহণ করে না 'application/json' ওয়ান এপ্রোচ হ'ল আপনার হেডার এবং প্যারামিটারগুলি কৌনিক থেকে আপডেট করা যাতে আপনার এপিআই সরাসরি ডেটা ব্যবহার করতে পারে।

প্রথমে আপনার ডেটা প্যারামিটারাইজ করুন:

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

তারপরে আপনার সাথে নিম্নলিখিতটি যুক্ত করুন$http

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

আপনার সমস্ত অনুরোধ পিএইচপি করতে গেলে প্যারামিটারগুলি কনফিগারেশনে নিম্নোক্তভাবে বিশ্বস্ত করা যেতে পারে:

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

?>

কৌণিক আচরণের কারণে পিএইচপি সার্ভারে স্বাভাবিক পোস্ট আচরণের জন্য সরাসরি কোনও পদ্ধতি নেই, সুতরাং আপনাকে এটিকে জসন অবজেক্টে পরিচালনা করতে হবে।


1
এটি ভুল। উপরে উত্তরগুলি দেখুন যেখানে পিএইচপি কাঁচা ইনপুট থেকে জেএসএন সরাসরি পড়া হয়। এটি কোয়েরি স্ট্রিংয়ের মধ্যে জেএসওএন মিশ্রণের চেয়ে অনেক বেশি সহজ।
মাইক ব্রেন্ট

.successএবং .errorপদ্ধতি অবচিত এবং AngularJS ফ্রেমওয়ার্ক থেকে সরিয়ে দেওয়া হয়েছে।
জর্জিউগ

6

আপনার ফর্ম ডেটা .post () এ দ্বিতীয় প্যারামিটার হিসাবে পাস করার আগে আপনার ফর্ম ডেটাটি ডিজাইরাইজ করতে হবে। আপনি jQuery এর para। পরিমাপ (ডেটা) পদ্ধতি ব্যবহার করে এটি অর্জন করতে পারেন। তারপরে আপনি সার্ভারের পক্ষ থেকে এটি $ .পস্ট ['ইমেল'] এর মতো উল্লেখ করতে সক্ষম হবেন;


6

এটি সেরা সমাধান (আইএমও) কারণ এটির জন্য কোনও জিকুয়েরি এবং কোনও জেএসএন ডিকোডের প্রয়োজন নেই:

সূত্র: 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
    $id = $_POST["id"];
?>

কি সম্পর্কে: JSON.stringify('{ id: 'some_id', name : 'some_name' }')বা $httpParamSerializerক্লায়েন্ট-পার্শ্ব রূপান্তর জন্য?
কিউআরটিএলস

5

এটি একটি পুরানো প্রশ্ন তবে এটি উল্লেখ করার মতো বিষয় যে কৌণিক 1.4 $ httpParamSerializer যোগ করা হয়েছে এবং $ http.post ব্যবহার করার সময়, আমরা পরামিতিগুলি পাস করার জন্য $ httpParamSerializer (প্যারাম) ব্যবহার করি, সমস্ত কিছু নিয়মিত পোস্ট অনুরোধের মতো কাজ করে এবং কোনও জেএসওএনকে ডিসিরিয়ালাইজিং হয় না সার্ভার সাইডে প্রয়োজন।

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


1

অ্যাঙ্গুলার এবং পিএইচপি-র সাথে কাজ করার সময় এটি বুঝতে আমার ঘন্টা সময় লেগেছে। পোস্ট ডেটা PH _POST এ পিএইচপি যাচ্ছিল না

পিএইচপি কোডে নিম্নলিখিতটি করুন। - একটি পরিবর্তনশীল able কৌণিক_ পোস্ট_প্রেমগুলি তৈরি করুন - তারপরে নিম্নলিখিতটি করুন $angular_http_params = (array)json_decode(trim(file_get_contents('php://input')));

আপনি এখন আপনার পরামিতিগুলি অ্যাক্সেস করতে পারেন যেমন আপনি $ _POST থেকে করেন do

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

নবাবিদের জন্য ... পৃষ্ঠায় আপনার সামগ্রী ধারক ধারকটিতে এনজি-অ্যাপ্লিকেশন এবং এনজি-কন্ট্রোলার নির্দেশাবলী যুক্ত করতে ভুলবেন না :)
তালহা

.successএবং .errorপদ্ধতি অবচিত এবং AngularJS ফ্রেমওয়ার্ক থেকে সরিয়ে দেওয়া হয়েছে।
জর্জিউগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.