AngularJs $ http.post() তথ্য পাঠায় না




angular-http (20)

কেউ কি আমাকে বলে দিতে পারে যে নিম্নোক্ত বিবৃতি পোস্টের ডেটা মনোনীত url এ কেন পাঠায় না? ইউআরএলটি বলা হয় তবে যখন আমি $ _POST মুদ্রণ করি তখন সার্ভারে - আমি একটি খালি অ্যারে পাই। আমি তথ্য যোগ করার আগে কনসোলে বার্তা প্রেরণ করি - এটি সঠিক সামগ্রী দেখায়।

$http.post('request-url',  { 'message' : message });

আমি স্ট্রিং হিসাবে ডাটা দিয়ে একই চেষ্টা করেছি (একই ফলাফল সহ):

$http.post('request-url',  "message=" + message);

আমি যখন নিম্নলিখিত ফরম্যাটে এটি ব্যবহার করি তখন এটি কাজ করছে বলে মনে হচ্ছে:

$http({
    method: 'POST',
    url: 'request-url',
    data: "message=" + message,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});

কিন্তু $ http.post () এর সাথে এটি করার একটি উপায় আছে - এবং এটিতে কাজ করার জন্য আমাকে সবসময় হেডার অন্তর্ভুক্ত করতে হবে? আমি বিশ্বাস করি যে উপরের বিষয়বস্তু টাইপ প্রেরিত ডেটার ফর্ম্যাট নির্দিষ্ট করে, তবে আমি কি এটি জাভাস্ক্রিপ্ট অবজেক্ট হিসাবে পাঠাতে পারি?


আমি angular js এবং ASP.NET WCF webservices ব্যবহার করছি নীচের কোডটি ব্যবহার করেছি:

 $http({
        contentType: "application/json; charset=utf-8",//required
        method: "POST",
        url: '../../operation/Service.svc/user_forget',
        dataType: "json",//optional
        data:{ "uid_or_phone": $scope.forgettel, "user_email": $scope.forgetemail },
        async: "isAsync"//optional

       }).success( function (response) {

         $scope.userforgeterror = response.d;                    
       })

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


@ ফেলিপ-মাইলসোর উত্তরটি তৈরি করতে:

  1. here থেকে একটি AngularJS মডিউল হিসাবে এটি ডাউনলোড here ,
  2. এটি ইনস্টল করুন
  3. আপনার আবেদন যোগ করুন:

    var app = angular.module('my_app', [ ... , 'httpPostFix']);

OP এর প্রস্তাবিত ফরম্যাট এবং ডেনিসনের উত্তরের মত, $http পরিবর্তে $http.post ব্যবহার ব্যতীত এবং এখনও jQuery এ নির্ভরশীল।

এখানে jQuery ব্যবহার সম্পর্কে ভাল জিনিস যে জটিল বস্তু সঠিকভাবে পাস করা হয়; ম্যানুয়ালি প্যারামিটারে ইউআরএল প্যারামিটারের পরিবর্তে যা ডেটা মার্বেল করতে পারে।

$http.post( 'request-url', jQuery.param( { 'message': message } ), {
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});

আপনার জেএস ফাইল এই যোগ করুন:

$http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";

এবং আপনার সার্ভার ফাইল এই যোগ করুন:

$params = json_decode(file_get_contents('php://input'), true);

যে কাজ করা উচিত।


আমার ক্ষেত্রে আমি এইরকম সমস্যা সমাধান করি:

var deferred = $q.defer();

$http({
    method: 'POST',
    url: 'myUri', 
    data: $.param({ param1: 'blablabla', param2: JSON.stringify(objJSON) }),
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
}).then(
    function(res) {
        console.log('succes !', res.data);
        deferred.resolve(res.data);
    },
    function(err) {
        console.log('error...', err);
        deferred.resolve(err);
    }
);
return deferred.promise;

আপনি JSON বস্তু ধারণকারী প্রতিটি প্যারামির জন্য JSON.stringify ব্যবহার করতে হবে এবং তারপরে "$ .param" :-) দিয়ে আপনার ডেটা অবজেক্ট তৈরি করতে হবে।

NB: আমার "objJSON" একটি JSON বস্তু যা অ্যারে, পূর্ণসংখ্যা, স্ট্রিং এবং HTML সামগ্রী রয়েছে। তার মোট আকার> 3500 অক্ষর।


আমারও অনুরূপ সমস্যা হয়েছে, এবং আমি ভাবছি এটি কীভাবে উপকারী হতে পারে: https://.com/a/11443066

var xsrf = $.param({fkey: "key"});
$http({
    method: 'POST',
    url: url,
    data: xsrf,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})

শুভেচ্ছা সহ,


আমি AngularJS এবং Node.js + এক্সপ্রেস 4 + রাউটার সঙ্গে একই সমস্যা ছিল

রাউটার শরীরের পোস্ট এর অনুরোধ থেকে তথ্য আশা। আমি যদি Angular ডক্স থেকে উদাহরণ অনুসরণ করে এই শরীর সবসময় খালি ছিল

নোটেশন 1

$http.post('/someUrl', {msg:'hello word!'})

কিন্তু আমি তথ্য ব্যবহার করে যদি

নোটেশন 2

$http({
       withCredentials: false,
       method: 'post',
       url: yourUrl,
       headers: {'Content-Type': 'application/x-www-form-urlencoded'},
       data: postData
 });

সম্পাদনা 1:

অন্যথায় node.js রাউটার req.body মধ্যে তথ্য আশা করা হবে যদি নোটেশন 1:

req.body.msg

যা JSON পেলਲੋਡ হিসাবে তথ্য পাঠায়। এটি আপনার ক্ষেত্রে জ্যাসন এবং এক্স-www-form-urlencoded এ্যারে আছে এমন কিছু ক্ষেত্রে আরও ভাল কিছু সমস্যা দেবে।

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


আমি উত্তর গৃহীত হয়েছে জানি। কিন্তু, নিম্নলিখিত ভবিষ্যতের পাঠকদের সাহায্য করতে পারে, যদি উত্তর কোনও কারণে তাদের পক্ষে উপযুক্ত না হয়।

কৌণিক jQuery হিসাবে AJAX একই কাজ করে না। যদিও আমি কৌণিক $httpprovider পরিবর্তন করার নির্দেশিকা অনুসরণ করার চেষ্টা $httpprovider , আমি অন্যান্য সমস্যা সম্মুখীন। যেমন আমি $this->input->is_ajax_request() ব্যবহার করি যার মধ্যে $this->input->is_ajax_request() ফাংশন সর্বদা ব্যর্থ হয়েছে (যা অন্য প্রোগ্রামার দ্বারা লিখিত এবং বিশ্বব্যাপী ব্যবহৃত হয়েছে, তাই পরিবর্তন করতে পারে না) বলছে এটি বাস্তব অ্যাকজ্যাক অনুরোধ ছিল না।

এটি সমাধান করার জন্য, আমি বিলম্বিত প্রতিশ্রুতি সাহায্য গ্রহণ। আমি ফায়ারফক্সে এটি পরীক্ষা করেছি, এবং IE9 এবং এটি কাজ করে।

আমি নিম্নলিখিত কোনও কৌণিক কোডের বাইরে সংজ্ঞায়িত ফাংশন আছে। এই ফাংশন নিয়মিত jquery AJAX কল করে এবং বিলম্বিত / প্রতিশ্রুতি দেয় (আমি এখনও শিখছি) অবজেক্ট।

function getjQueryAjax(url, obj){
    return $.ajax({
        type: 'post',
        url: url,
        cache: true,
        data: obj
    });
}

তারপর আমি নিম্নলিখিত কোড ব্যবহার করে এটি কৌণিক কোড কল করছি। দয়া করে মনে রাখবেন যে আমাদের $scope ব্যবহার করে $scope ম্যানুয়ালি আপডেট করতে হবে $scope.$apply()

    var data = {
        media: "video",
        scope: "movies"
    };
    var rPromise = getjQueryAjax("myController/getMeTypes" , data);
    rPromise.success(function(response){
        console.log(response);
        $scope.$apply(function(){
            $scope.testData = JSON.parse(response);
            console.log($scope.testData);
        });
    }).error(function(){
        console.log("AJAX failed!");
    });

এটি নিখুঁত উত্তর হতে পারে না, তবে এটি আমাকে কৌণিকের সাথে জ্যাকারি এজেক্স কলগুলি ব্যবহার করার অনুমতি দেয় এবং আমাকে $scope আপডেট করার অনুমতি দেয়।


আমি এক্সপ্রেস এ একই সমস্যা ছিল .. আপনি HTTP অনুরোধ পাঠানোর আগে JSON বস্তু বিশ্লেষণ করতে bodyparser ব্যবহার করতে হবে সমাধান করার জন্য ..

app.use(bodyParser.json());

আমি এপিএনএন এমভিসি ব্যবহার করে একই সমস্যা ছিল এবং এখানে সমাধান পাওয়া যায়

কেন $http.post() সেবা শর্ট্যান্ড ফাংশন ( $http.post() , ইত্যাদি) jQuery সমতুল্য ( jQuery.post() , ইত্যাদি) এর সাথে jQuery.post() বলে মনে হচ্ছে না কেন AngularJS এ নতুনদের মধ্যে অনেক বিভ্রান্তি রয়েছে।

পার্থক্য jQuery এবং AngularJS serialize এবং তথ্য প্রেরণ কিভাবে হয়। মূলত, সমস্যাটি আপনার সার্ভারের ভাষাগুলির সাথে রয়েছে, যা AngularJS- এর ট্রান্সমিশনটি নেতিবাচকভাবে বুঝতে পারছে না ... ডিফল্টরূপে, jQuery ব্যবহার করে ডেটা প্রেরণ করে

Content-Type: x-www-form-urlencoded

এবং পরিচিত foo=bar&baz=moe serialization।

AngularJS , তবে, ব্যবহার করে তথ্য প্রেরণ

Content-Type: application/json 

এবং { "foo": "bar", "baz": "moe" }

JSON সিরিয়ালাইজেশান, যা দুর্ভাগ্যবশত কিছু ওয়েব সার্ভার ভাষাগুলি - বিশেষ করে পিএইচপি - নেটিভভাবে অকার্যকর নয়।

একটি যাদুমন্ত্র মত কাজ করে.

কোড

// Your app's root module...
angular.module('MyModule', [], function($httpProvider) {
  // Use x-www-form-urlencoded Content-Type
  $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';

  /**
   * The workhorse; converts an object to x-www-form-urlencoded serialization.
   * @param {Object} obj
   * @return {String}
   */ 
  var param = function(obj) {
    var query = '', name, value, fullSubName, subName, subValue, innerObj, i;

    for(name in obj) {
      value = obj[name];

      if(value instanceof Array) {
        for(i=0; i<value.length; ++i) {
          subValue = value[i];
          fullSubName = name + '[' + i + ']';
          innerObj = {};
          innerObj[fullSubName] = subValue;
          query += param(innerObj) + '&';
        }
      }
      else if(value instanceof Object) {
        for(subName in value) {
          subValue = value[subName];
          fullSubName = name + '[' + subName + ']';
          innerObj = {};
          innerObj[fullSubName] = subValue;
          query += param(innerObj) + '&';
        }
      }
      else if(value !== undefined && value !== null)
        query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
    }

    return query.length ? query.substr(0, query.length - 1) : query;
  };

  // Override $http service's default transformRequest
  $httpProvider.defaults.transformRequest = [function(data) {
    return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;
  }];
});

আমি নীচের কোড দ্বারা এই সমাধান:

ক্লায়েন্ট সাইড (জেএস):

     $http({
                url: me.serverPath,
                method: 'POST',
                data: data,
                headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            }).
                success(function (serverData) {
                    console.log("ServerData:", serverData);
    ......

তথ্য একটি বস্তু লক্ষ্য করুন।

সার্ভারে (ASP.NET MVC):

[AllowCrossSiteJson]
        public string Api()
        {
            var data = JsonConvert.DeserializeObject<AgentRequest>(Request.Form[0]);
            if (data == null) return "Null Request";
            var bl = Page.Bl = new Core(this);

            return data.methodName;
        }

এবং ক্রস ডোমেন অনুরোধের জন্য 'AllowCrossSiteJsonAttribute' এর প্রয়োজন হয়:

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
            base.OnActionExecuting(filterContext);
        }
    }

এই দরকারী ছিল আশা করি।


আমি প্যারামি পোস্ট বস্তু রূপান্তর একটি ফাংশন ব্যবহার করতে চান।

myobject = {'one':'1','two':'2','three':'3'}

Object.toparams = function ObjecttoParams(obj) {
    var p = [];
    for (var key in obj) {
        p.push(key + '=' + encodeURIComponent(obj[key]));
    }
    return p.join('&');
};

$http({
    method: 'POST',
    url: url,
    data: Object.toparams(myobject),
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})

এই অবশেষে httpParamSerializerJQLike ব্যবহার করে কৌণিক 1.4 এ সম্বোধন করা হয়েছে

https://github.com/angular/angular.js/issues/6039 দেখুন

.controller('myCtrl', function($http, $httpParamSerializerJQLike) {
$http({
  method: 'POST',
  url: baseUrl,
  data: $httpParamSerializerJQLike({
    "user":{
      "email":"[email protected]",
      "password":"123456"
    }
  }),
  headers:
    'Content-Type': 'application/x-www-form-urlencoded'
})})

এই কোড আমার জন্য সমস্যা সমাধান। এটি একটি অ্যাপ্লিকেশন-স্তর সমাধান:

moduleName.config(['$httpProvider',
  function($httpProvider) {
    $httpProvider.defaults.transformRequest.push(function(data) {
        var requestStr;
        if (data) {
            data = JSON.parse(data);
            for (var key in data) {
                if (requestStr) {
                    requestStr += "&" + key + "=" + data[key];
                } else {
                    requestStr = key + "=" + data[key];
                }
            }
        }
        return requestStr;
    });
    $httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";
  }
]);

এটি উপরের উপরে পরিষ্কার নয়, তবে যদি আপনি পিএইচপিতে অনুরোধটি পান তবে আপনি এটি ব্যবহার করতে পারেন:

$params = json_decode(file_get_contents('php://input'),true);

একটি AngularJS পোস্ট থেকে পিএইচপি একটি অ্যারে অ্যাক্সেস করতে।


এটি সম্ভবত একটি দেরী উত্তর কিন্তু আমি মনে করি কোডটি ব্যবহার করার সবচেয়ে সঠিক $httpParamSerializer কোনও "পেতে" অনুরোধ করার সময় আপনার কাছে $httpParamSerializer এটি আপনার কন্ট্রোলারকে $httpParamSerializer করতে হবে। Jquery এ সব ব্যবহার করতে, $http.post(url,$httpParamSerializer({param:val}))

app.controller('ctrl',function($scope,$http,$httpParamSerializer){
    $http.post(url,$httpParamSerializer({param:val,secondParam:secondVal}));
}

যখন আমার এই সমস্যা ছিল তখন আমি যে প্যারামিটারটি পোস্ট করছিলাম তা একটি সাধারণ বস্তুর পরিবর্তে বস্তুর একটি অ্যারে হিসাবে পরিণত হয়েছিল।


যদি আপনার পিএইচপি ব্যবহার করা হয় তবে এটি AngularJS পোস্ট থেকে পিএইচপি এ অ্যারে অ্যাক্সেস করার একটি সহজ উপায়।

$params = json_decode(file_get_contents('php://input'),true);

সার্ভারে ডেটা পাঠাতে $ http.post পদ্ধতিটি কীভাবে ব্যবহার করবেন এবং এটি কেন এই ক্ষেত্রে কাজ করছে না তার সম্পূর্ণ কোড স্নিপেট খুঁজে পাওয়া যায়নি।

নীচের কোড স্নিপেট এর ব্যাখ্যা ...

  1. আমি জাভাস্ক্রিপ্ট $ .param ফাংশন ব্যবহার করা হয় JSON তথ্য serialize www পোস্ট তথ্য
  2. কনফিগারেশন ভেরিয়েবলে কনটেন্ট-টাইপ সেট করা যা angularJS $ http.post এর অনুরোধের সাথে পাশ করা হবে যা সার্ভারকে নির্দেশ দেয় যে আমরা www পোস্ট ফর্ম্যাটে ডেটা পাঠাচ্ছি।

  3. $ Htttp.post পদ্ধতিটি লক্ষ্য করুন, যেখানে আমি ইউআরএল হিসাবে প্রথম প্যারামিটার পাঠাচ্ছি, দ্বিতীয় প্যারামিটারটি ডাটা (সিরিয়ালাইজড) এবং কনফিগারেশন হিসাবে তৃতীয় প্যারামিটার হিসাবে প্রেরণ করছি।

অবশিষ্ট কোড স্ব বোঝা হয়।

$scope.SendData = function () {
           // use $.param jQuery function to serialize data from JSON 
            var data = $.param({
                fName: $scope.firstName,
                lName: $scope.lastName
            });

            var config = {
                headers : {
                    'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
                }
            }

            $http.post('/ServerRequest/PostDataResponse', data, config)
            .success(function (data, status, headers, config) {
                $scope.PostDataResponse = data;
            })
            .error(function (data, status, header, config) {
                $scope.ResponseDetails = "Data: " + data +
                    "<hr />status: " + status +
                    "<hr />headers: " + header +
                    "<hr />config: " + config;
            });
        };

এখানে $ http.post পদ্ধতির কোড উদাহরণটি দেখুন।


$http ang angjjs সহ পোস্ট মেথোডের মাধ্যমে ডেটা পাঠাতে আপনাকে পরিবর্তন করতে হবে

data: "message=" + message , data: $.param({message:message})





angular-http