AngularJs $ http.post () ডেটা প্রেরণ করে না


337

যে কেউ আমাকে বলতে পারে যে নীচের বিবৃতিটি পোস্টের ডেটা মনোনীত ইউআরএলে কেন পাঠায় না? ইউআরএল বলা হয় তবে সার্ভারে যখন আমি print _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 () দিয়ে এটি করার কোনও উপায় আছে - এবং এটির কাজ করার জন্য আমি কি সর্বদা শিরোনামকে অন্তর্ভুক্ত করতে পারি? আমি বিশ্বাস করি যে উপরের বিষয়বস্তুর প্রকারটি প্রেরিত ডেটার ফর্ম্যাট নির্দিষ্ট করে তবে আমি কি এটি জাভাস্ক্রিপ্ট অবজেক্ট হিসাবে প্রেরণ করতে পারি?


ইউআরএল কি একই উত্স হয়?
fmquaglia

দুঃখিত - হ্যাঁ সমস্ত উদাহরণের জন্য এটি একই ইউআরএল
স্প্যান্সার মার্ক

@ স্পেন্সারমার্ক দুঃখিত .. আমি আপনার ওয়ার্কিং কোডের উপরে চেষ্টা করেছি .. এটি আমার পক্ষে কাজ করছে না।
অরুল সিদ্ধন

উত্তর:


346

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

অ্যাঙ্গুলারজেএস-এ নতুন আগতদের মধ্যে অনেক বিভ্রান্তি রয়েছে কেন $httpপরিষেবা শর্টহ্যান্ড ফাংশন ( $http.post()ইত্যাদি) jQuery সমতুল্য (( jQuery.post()ইত্যাদি) দিয়ে অদলবদল বলে মনে হয় না to

পার্থক্যটি কীভাবে jQuery এবং AngularJS ডেটা সিরিয়াল করে এবং সংক্রমণ করে। মৌলিকভাবে, সমস্যাটি আপনার সার্ভারের ভাষাটি পছন্দ করে অ্যাঙ্গুলারজেএসের সংক্রমণ স্থানীয়ভাবে বুঝতে অক্ষম হওয়ায় ... ডিফল্টরূপে, jQuery ব্যবহার করে ডেটা প্রেরণ করে

Content-Type: x-www-form-urlencoded

এবং পরিচিত foo=bar&baz=moeসিরিয়ালাইজেশন।

AngularJS তবে ডেটা ব্যবহার করে সংক্রমণ করে m

Content-Type: application/json 

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

JSON সিরিয়ালাইজেশন, যা দুর্ভাগ্যক্রমে কিছু ওয়েব সার্ভারের ভাষাগুলি PH উল্লেখযোগ্যভাবে পিএইচপি - স্থানীয়ভাবে আনসিরিয়ালাইজড না।

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

কোড

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

7
বোর করার জন্য আমি এই স্ক্রিপ্টটি bower install angular-post-fix --save-devযুক্ত করেছি, এটি যুক্ত করতে ব্যবহার করুন।
বিলি ব্লেজ

পিএইচপি এর ট্রান্সমিট ডেটা পদ্ধতি পরিবর্তন করার একটি উপায় আছে। কারণ আমি বর্তমানে ইস্যুটিই করছি।
দেমডাভ

1
এই কোডটি বেশিরভাগ অংশে দুর্দান্ত কাজ করে তবে খালি বস্তু বা এমনকি সমতল খালি মানগুলির শ্রেণিবদ্ধতা জমা দেওয়ার সময় আমার এতে সমস্যা ছিল। উদাহরণস্বরূপ, {a: 1, b: {c: {d:}}}}, e: অপরিজ্ঞাত, চ: নাল, জি: 2 properly সঠিকভাবে এনকোড করা হবে না, এবং পিএইচপি এটি "[a" = হিসাবে পাবে > "1", "জি" => "2"]। "খ" এর অধীনে পুরো কাঠামো, পাশাপাশি কীগুলি সহ "ই" এবং "এফ" - হারিয়ে যাবে। আমি নীচে বিকল্প কোড পোস্ট করেছি, যার সাহায্যে উপরের কাঠামোটি ডিকোড হয়ে যায়: ["a" => "1", "বি" => ["সি" => ["ডি" => ""]], "ই" => "", "চ" => "", "জি" => "২"]।
Obe

1
মাল্টিপার্ট / ফর্ম-ডেটার জন্য আমি কীভাবে এটি প্রয়োগ করব?
ডেভিডলি

চমত্কার :) প্রকৃতপক্ষে একটি কবজির মতো কাজ করেছে। আমি স্প্রিং এমভিসি
এসকেউল

115

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

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

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


3
এটির সাথে $ _POST অ্যারেটি ওভাররাইট করার সময় এটিকে একটি অ্যারেতে জোর করার জন্য আমাকে সত্য যুক্ত করতে হবে। json_decode(file_get_contents('php://input'), true);
জন

4
@ জালাবোজা, আমি একমত হই যে কোনও সমাধান 'ইউনিভার্সাল' হিসাবে বিবেচনা করা কঠিন, তবে আমি সম্মত হই না যে এটি 'হ্যাকি' --- পিএইচপি.এন.টি বলেছে: "ফাইল_জেট_কন্টেন্টস () বিষয়বস্তু পড়ার পছন্দের উপায় স্ট্রিংয়ের মধ্যে একটি ফাইল। এটি পারফরম্যান্স বাড়ানোর জন্য আপনার ওএস দ্বারা সমর্থিত হলে মেমরি ম্যাপিং কৌশলগুলি ব্যবহার করবে "" মঞ্জুর যে আমরা এই পরিস্থিতিতে কোনও ফাইল পড়ছি না তবে আমরা পোস্ট করা জসন ডেটা পড়ছি। আপনি যদি নতুন উত্তরটি অবদান রাখতে পারেন বা পাঠকদের (আমাকে সহ) এই সম্পর্কে আরও ভাল সিদ্ধান্ত নিতে সহায়তা করতে নতুন তথ্য সরবরাহ করতে পারেন তবে দুর্দান্ত হবে।
ডন এফ

78

আপনি ডিফল্ট "সামগ্রী-প্রকার" সেট করতে পারেন:

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

dataফর্ম্যাট সম্পর্কে :

$ Http.post এবং $ http.put পদ্ধতিগুলি কোনও জাভাস্ক্রিপ্ট অবজেক্ট (বা একটি স্ট্রিং) মান তাদের ডেটা প্যারামিটার হিসাবে গ্রহণ করে। যদি ডেটা কোনও জাভাস্ক্রিপ্ট অবজেক্ট হয় তবে এটি ডিফল্টরূপে, জেএসএন স্ট্রিংয়ে রূপান্তরিত হবে।

এই প্রকরণটি ব্যবহার করার চেষ্টা করুন

function sendData($scope) {
    $http({
        url: 'request-url',
        method: "POST",
        data: { 'message' : message }
    })
    .then(function(response) {
            // success
    }, 
    function(response) { // optional
            // failed
    });
}

9
এটি কাজ করে বলে মনে হচ্ছে না। আমি স্ট্রিং এবং: শিরোনাম হিসাবে ডেটাগুলির সাথে পরিবর্তনের চেষ্টা করেছি: application 'সামগ্রী-প্রকার': 'অ্যাপ্লিকেশন / x-www-form-urlencoded'} - এবং এটি কাজ করে বলে মনে হচ্ছে, তবে কী করার আরও ভাল উপায় আছে? এটা?
স্পেনসার মার্ক

2
উপরে বর্ণিত হিসাবে ডিফল্ট সামগ্রীর প্রকার সেট করুন এবং ডেটার জন্য js অবজেক্ট ব্যবহার করবেন না। এর মতো স্ট্রিং ব্যবহার করুন: 'ম্যাসেজ =' + বার্তা আমার জন্য কাজ করে
gSরিতে

58

আমারও একই রকম সমস্যা হয়েছে এবং আমিও ভাবছি যে এটিও কার্যকর হতে পারে: https://stackoverflow.com/a/11443066

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

শুভেচ্ছা সহ,


দেখে মনে হচ্ছে শিরোনামগুলি কেবল আমাদের প্রয়োজনীয় পরিবর্তন ছিল। ধন্যবাদ!
বেন গুথ্রি

ধন্যবাদ, এটি আমার জন্য করেছে :) সমস্যাটি ছিল পোস্টের ডেটা এনকোডিং।
দান

33

আমি পদগুলিকে প্যারামে রূপান্তর করতে একটি ফাংশন ব্যবহার করতে চাই।

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

30

শেষ পর্যন্ত এটিকে ular 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":"wahxxx@gmail.com",
      "password":"123456"
    }
  }),
  headers:
    'Content-Type': 'application/x-www-form-urlencoded'
})})

আমি POST 192.168.225.75:7788/procure/p/search 400 (খারাপ অনুরোধ) সমস্যার মুখোমুখি হচ্ছি
অনুজ

19

আমি অ্যাংুলারজেএস পোস্ট পুনঃনির্মাণের সাথে jQuery প্যারাম ব্যবহার করি । এখানে একটি উদাহরণ রয়েছে ... AngularJS অ্যাপ্লিকেশন মডিউল তৈরি করুন, যেখানে আপনার এইচটিএমএল কোডের সাথে সংজ্ঞায়িত করা হয়েছে।myappng-app

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

এখন আসুন আমরা একটি লগইন কন্ট্রোলার এবং পোস্ট ইমেইল এবং পাসওয়ার্ড তৈরি করি।

app.controller('LoginController', ['$scope', '$http', function ($scope, $http) {
    // default post header
    $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
    // send login data
    $http({
        method: 'POST',
        url: 'https://example.com/user/login',
        data: $.param({
            email: $scope.email,
            password: $scope.password
        }),
        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    }).success(function (data, status, headers, config) {
        // handle success things
    }).error(function (data, status, headers, config) {
        // handle error things
    });
}]);

আমি কোডটি ব্যাখ্যা করতে চাই না, এটি বোঝার পক্ষে যথেষ্ট সহজ :) নোটটি paramjQuery থেকে প্রাপ্ত, সুতরাং এটি কার্যকর করার জন্য আপনাকে অবশ্যই jQuery এবং AngularJS উভয়ই ইনস্টল করতে হবে। এখানে একটি স্ক্রিন শট হয়.

এখানে চিত্র বর্ণনা লিখুন

আশা করি এটি সহায়ক। ধন্যবাদ!


10

অ্যাংুলার জেএস এবং নোড.জেএস + এক্সপ্রেস 4 + রাউটার নিয়ে আমার একই সমস্যা ছিল

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

স্বরলিপি ঘ

$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:

অন্যথায় নোড.জেএস রাউটার নোট 1:

req.body.msg

যা জেএসএন পেডলোড হিসাবেও তথ্য প্রেরণ করে। এটি এমন কিছু ক্ষেত্রে ভাল যেখানে আপনার জসনে আরে রয়েছে এবং x-www-form-urlencoded কিছু সমস্যা দেবে।

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


10

JQuery এর বিপরীতে এবং পদযাত্রার স্বার্থে, কৌণিক একটি ক্লায়েন্ট থেকে সার্ভারে পোস্ট ডেটা স্থানান্তর করার জন্য JSON ফর্ম্যাট ব্যবহার করে (JQuery এক্স-www-form-urlencoded সম্ভবত প্রয়োগ করে, যদিও জিকুয়েরি এবং অ্যাঙ্গুলার ডেটা ইমপ্রুটের জন্য JSON ব্যবহার করে)। সুতরাং সমস্যার দুটি অংশ রয়েছে: জেএস ক্লায়েন্ট অংশে এবং আপনার সার্ভার অংশে। সুতরাং আপনার প্রয়োজন:

  1. জেএস কৌণিক ক্লায়েন্ট অংশটি এভাবে রাখুন:

    $http({
    method: 'POST',
    url: 'request-url',
    data: {'message': 'Hello world'}
    });

এবং

  1. ক্লায়েন্টের কাছ থেকে ডেটা পেতে আপনার সার্ভার অংশে লিখুন (যদি এটি পিএইচপি হয়)।

            $data               = file_get_contents("php://input");
            $dataJsonDecode     = json_decode($data);
            $message            = $dataJsonDecode->message;
            echo $message;     //'Hello world'

দ্রষ্টব্য: $ _POST কাজ করবে না!

সমাধানটি আমার জন্য ভাল, আশা এবং আপনার জন্য কাজ করে।



7

@ ফেলিপ-মায়োসো এর উত্তর তৈরি করতে:

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

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

6

আমার মন্তব্য করার খ্যাতি নেই, তবে ডন এফ এর উত্তরের প্রতিক্রিয়া / সংযোজন হিসাবে:

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

কোনও এসোসিয়েটিভ অ্যারে যথাযথভাবে ফিরিয়ে trueআনতে json_decodeফাংশনে একটি দ্বিতীয় প্যারামিটার যুক্ত করা দরকার:

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


6

কৌণিক

  var payload = $.param({ jobId: 2 });

                this.$http({
                    method: 'POST',
                    url: 'web/api/ResourceAction/processfile',
                    data: payload,
                    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
                });

ওয়েবএপিআই 2

public class AcceptJobParams
        {
            public int jobId { get; set; }
        }

        public IHttpActionResult ProcessFile([FromBody]AcceptJobParams thing)
        {
            // do something with fileName parameter

            return Ok();
        }

5

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

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

5

এটি আপনার জেএস ফাইলে যুক্ত করুন:

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

এবং এটি আপনার সার্ভার ফাইলে যুক্ত করুন:

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

এটা কাজ করা উচিত।


4

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

var paramsVal={data:'"id":"1"'};
  $http.post("Request URL",  {params: paramsVal});  

তবে এই ফোরাম এবং এপিআই ডকটি পড়ে আমি নিম্নলিখিত পদ্ধতি অনুসরণ করার চেষ্টা করেছি এবং এটি আমার পক্ষে কাজ করে। কারও কারও যদি একইরকম সমস্যা হয় তবে আপনি নীচেও চেষ্টা করতে পারেন।

$http({
      method: 'POST',
      url: "Request URL",           
      params: paramsVal,
      headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'}
            });

পরম কনফিগারেশন কী করে তার জন্য দয়া করে https://docs.angularjs.org/api/ng/service/ $ http # পোস্ট পরীক্ষা করুন । {ডেটা: '"আইডি": "1"'} - স্ট্রিং বা অবজেক্টের মানচিত্র যা ইউআরএল রূপান্তরিত হবে? ডেটা = "আইডি: 1"


4

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

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

4

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

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.stringify ব্যবহার করতে হবে প্রতিটি JSON অবজেক্টযুক্ত প্যারামের জন্য, এবং তারপরে "para .param" দিয়ে আপনার ডেটা অবজেক্টটি তৈরি করতে হবে :-)

এনবি: আমার "Jজেক্টসন" হ'ল একটি জেএসওএন অবজেক্ট যা অ্যারে, পূর্ণসংখ্যা, স্ট্রিং এবং এইচটিএমএল সামগ্রী রয়েছে। তার মোট আকার> 3500 টি অক্ষর।


3

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

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

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

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

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

তারপরে আমি এটিকে নীচের কোডটি ব্যবহার করে কৌনিক কোড বলছি। দয়া করে মনে রাখবেন যে $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


2
কৌণিকের তার প্রতিশ্রুতি পরিষেবাটি 1.3 থেকে। Q নামে পরিচিত। কোনও পোস্টের জন্য JQuery ব্যবহার করার দরকার নেই।
এমবোকিল

3

এক্সপ্রেসে আমারও একই সমস্যা ছিল .. সমাধান করার জন্য আপনাকে এইচটিসি অনুরোধগুলি প্রেরণের আগে জডসন বস্তু পার্স করার জন্য বডিপারসার ব্যবহার করতে হবে ..

app.use(bodyParser.json());

3

আমি কৌনিক জেএস এবং নীচের কোডের কোড সহ এসপ নেট ডাব্লুসিএফ ওয়েবসার্ভিস ব্যবহার করছি:

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

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


3

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

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

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

  3. $ Httpsp.post পদ্ধতিটি লক্ষ্য করুন, যেখানে আমি url হিসাবে 1 ম প্যারামিটার, ডেটা হিসাবে 2 য় প্যারামিটার (সিরিয়ালযুক্ত) এবং কনফিগার হিসাবে তৃতীয় পরামিতি প্রেরণ করছি।

বাকী কোডটি স্ব-বোঝা।

$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 পদ্ধতির কোড উদাহরণটি দেখুন ।


3

যদি আপনি পিএইচপি ব্যবহার করেন তবে এটি কোনও অ্যাঙ্গুলারজেএস পোস্ট থেকে পিএইচপি-তে কোনও অ্যারে অ্যাক্সেস করার সহজ উপায়।

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


3

যদি কৌণিক> = 1.4 ব্যবহার করা হয় তবে এখানে কৌণিক দ্বারা সরবরাহিত সিরিয়ালাইজারটি ব্যবহার করে সবচেয়ে পরিষ্কার সমাধান দেওয়া হয়েছে :

angular.module('yourModule')
  .config(function ($httpProvider, $httpParamSerializerJQLikeProvider){
    $httpProvider.defaults.transformRequest.unshift($httpParamSerializerJQLikeProvider.$get());
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
});

এবং তারপরে আপনি নিজের অ্যাপ্লিকেশনটিতে যে কোনও জায়গায় এটি করতে পারেন:

$http({
  method: 'POST',
  url: '/requesturl',
  data: {
    param1: 'value1',
    param2: 'value2'
  }
});

এবং এটি ডেটাটিকে যথাযথভাবে সিরিয়ালাইজ করবে এবং এটিকে বিষয়বস্তু-টাইপ শিরোনামের সাথে param1=value1&param2=value2প্রেরণ করবে কারণ এটি সাধারণত শেষ পয়েন্টগুলিতে POST অনুরোধগুলির সাথে প্রত্যাশিত।/requesturlapplication/x-www-form-urlencoded; charset=utf-8

টি এল; ডিআর

আমার গবেষণা চলাকালীন আমি দেখতে পেলাম যে এই সমস্যার উত্তর অনেকগুলি স্বাদে আসে; কিছু খুব সংশ্লেষিত হয় এবং কাস্টম ফাংশনগুলির উপর নির্ভর করে, কিছু jQuery এর উপর নির্ভর করে এবং কিছু আপনাকে পরামর্শ দেয় যে কেবলমাত্র শিরোলেখ সেট করা দরকার plete

আপনি যদি কেবল Content-Typeশিরোনামটি সেট করেন , শেষ পয়েন্টটি পোস্টের ডেটা দেখতে পাবে, তবে এটি স্ট্যান্ডার্ড ফর্ম্যাটে থাকবে না কারণ আপনি যদি স্ট্রিং সরবরাহ না করেন তবেdata বা নিজের ডেটা অবজেক্টটিকে ম্যানুয়ালি সিরিয়ালাইজ না করলে এটি সমস্তই JSON হিসাবে সিরিয়ালযুক্ত করা হবে ডিফল্ট এবং শেষ পয়েন্টে ভুল ব্যাখ্যা করা যেতে পারে।

উদাহরণস্বরূপ, যদি উপরের উদাহরণে সঠিক সিরিয়ালাইজার সেট না করা থাকে তবে এটি শেষ পয়েন্টে এইভাবে দেখা যাবে:

{"param1":"value1","param2":"value2"}

এবং এটি অপ্রত্যাশিত পার্সিং হতে পারে, যেমন এএসপি.এনইটি এটিকে মান হিসাবে একটি nullপ্যারামিটার নাম হিসাবে গণ্য করে {"param1":"value1","param2":"value2"}; বা ফিডলার {"param1":"value1","param2":"value2"}প্যারামিটারের নাম এবং nullমান হিসাবে এটি অন্যভাবে ব্যাখ্যা করে ।


3

ওপি অনুরূপ ফর্ম্যাট & Denison এর উত্তর কাজ প্রস্তাব দেওয়া হচ্ছে ব্যবহার ছাড়া $http.postপরিবর্তে মাত্র$http এবং এখনও jQuery এর উপর নির্ভরশীল।

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

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

2

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


2

সবেমাত্র কৌনিক 1.2 থেকে 1.3 থেকে আপডেট হয়েছে, কোডটিতে একটি সমস্যা পেয়েছে। একটি উত্স রূপান্তর একটি অন্তহীন লুপ বাড়ে কারণ (আমি মনে করি) of প্রতিশ্রুতি আবার একই বস্তু ধরে রাখা। সম্ভবত এটি কাউকে সাহায্য করবে ...

আমি এটি দ্বারা ঠিক করতে পারলাম:

[...]
  /**
 * 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;

angular.forEach(obj, function(value, name) {
+    if(name.indexOf("$promise") != -1) {
+        return;
+    }

    value = obj[name];
    if (value instanceof Array) {
        for (i = 0; i < value.length; ++i) {
[...]

2

আমি কিছুক্ষণের জন্য স্বীকৃত উত্তরের কোড (ফিলিপের কোড) ব্যবহার করছি এবং এটি দুর্দান্ত কাজ করছে (ধন্যবাদ, ফিলিপ!)।

তবে সম্প্রতি আমি আবিষ্কার করেছি যে এটিতে খালি জিনিস বা অ্যারে নিয়ে সমস্যা রয়েছে। উদাহরণস্বরূপ, এই বস্তুটি জমা দেওয়ার সময়:

{
    A: 1,
    B: {
        a: [ ],
    },
    C: [ ],
    D: "2"
}

পিএইচপি মোটেও বি এবং সি দেখে বলে মনে হচ্ছে না। এটি এটি পায়:

[
    "A" => "1",
    "B" => "2"
]

ক্রোমে আসল অনুরোধের দিকে নজর দেওয়া এটি দেখায়:

A: 1
:
D: 2

আমি একটি বিকল্প কোড স্নিপেট লিখেছি। এটি আমার ব্যবহারের ক্ষেত্রে ভালভাবে কাজ করছে বলে মনে হচ্ছে তবে আমি এটির ব্যাপকভাবে পরীক্ষা করিনি তাই সতর্কতার সাথে ব্যবহার করুন।

আমি টাইপস্ক্রিপ্ট ব্যবহার করেছি কারণ আমার দৃ strong় টাইপিং পছন্দ হয় তবে খাঁটি জেএসে রূপান্তর করা সহজ হবে:

angular.module("MyModule").config([ "$httpProvider", function($httpProvider: ng.IHttpProvider) {
    // Use x-www-form-urlencoded Content-Type
    $httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";

    function phpize(obj: Object | any[], depth: number = 1): string[] {
        var arr: string[] = [ ];
        angular.forEach(obj, (value: any, key: string) => {
            if (angular.isObject(value) || angular.isArray(value)) {
                var arrInner: string[] = phpize(value, depth + 1);
                var tmpKey: string;
                var encodedKey = encodeURIComponent(key);
                if (depth == 1) tmpKey = encodedKey;
                else tmpKey = `[${encodedKey}]`;
                if (arrInner.length == 0) {
                    arr.push(`${tmpKey}=`);
                }
                else {
                    arr = arr.concat(arrInner.map(inner => `${tmpKey}${inner}`));
                }
            }
            else {
                var encodedKey = encodeURIComponent(key);
                var encodedValue;
                if (angular.isUndefined(value) || value === null) encodedValue = "";
                else encodedValue = encodeURIComponent(value);

                if (depth == 1) {
                    arr.push(`${encodedKey}=${encodedValue}`);
                }
                else {
                    arr.push(`[${encodedKey}]=${encodedValue}`);
                }
            }
        });
        return arr;
    }

    // Override $http service's default transformRequest
    (<any>$httpProvider.defaults).transformRequest = [ function(data: any) {
        if (!angular.isObject(data) || data.toString() == "[object File]") return data;
        return phpize(data).join("&");
    } ];
} ]);

এটি ফিলিপের কোডের চেয়ে কম দক্ষ তবে আমার মনে হয় না যে এটি HTTP অনুরোধের সামগ্রিক ওভারহেডের সাথে তাত্ক্ষণিকভাবে হওয়া উচিত since

এখন পিএইচপি দেখায়:

[
    "A" => "1",
    "B" => [
        "a" => ""
    ],
    "C" => "",
    "D" => "2"
]

যতদূর আমি জানি যে পিএইচপি পাওয়া যে বা ও সি খালি অ্যারে রয়েছে তা সনাক্ত করা সম্ভব নয়, তবে কমপক্ষে কীগুলি উপস্থিত হয়, যা গুরুত্বপূর্ণ যখন নির্দিষ্ট কোডের উপর নির্ভর করে তখনও এটির প্রয়োজনীয়তা খালি ভিতরে থাকে।

এছাড়াও মনে রাখবেন এটি পরিবর্তন করে অনির্ধারিত s এবং নাল গুলি স্ট্রিং খালি করতে।


জাভাস্ক্রিপ্টের সাথে পিইও-তে কোড দেওয়ার সর্বোত্তম উপায় টাইপস্ক্রিপ্ট!
বিকৃত করা

2

দ্বিতীয় প্যারামিটার হিসাবে আপনি যে ডেটা পাঠাতে চান তা কেবল রাখুন:

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

এছাড়াও কাজ করে যে অন্য ফর্মটি হ'ল:

$http.post('request-url',  { params: { paramName: value } });

নিশ্চিত করো যে paramName ফাংশনটি কল করছেন তার প্যারামিটারের নামটি ঠিক মেলে তা ।

উত্স: AngularJS পোস্ট শর্টকাট পদ্ধতি


5
এই উত্তরটি কেন বাতিল করা হয়েছে তা কি কেউ ব্যাখ্যা করতে পারেন?
মার্কো ল্যাকোভিক

1
এই সমাধানটির পক্ষে ভোট দেওয়ার কোনও উপায় নেই, এটি কৌনিক ডকুমেন্টেশন ডকস.আঙ্গুলারজেএস.আর.সি.ইউঙ্গুলারজেস.আর.সি.আই
এন /

1

আমি নীচের কোডগুলি দ্বারা এটি সমাধান করেছি:

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

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

আশা করি এটি কার্যকর ছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.