আমি কীভাবে অনুরোধ পে-লোডের পরিবর্তে ফর্ম ডেটা হিসাবে ডেটা পোস্ট করতে পারি?


522

নীচের $httpকোডে, কৌণিক জেএস পদ্ধতিটি ইউআরএলকে কল করে এবং xsrf অবজেক্টটিকে "অনুরোধ পেলোড" হিসাবে জমা দেয় (ক্রোম ডিবাগার নেটওয়ার্ক ট্যাবে বর্ণিত)। JQuery $.ajaxপদ্ধতি একই কল করে তবে xsrf কে "ফর্ম ডেটা" হিসাবে জমা দেয়।

আমি কীভাবে অ্যাঙ্গুলারজেএসকে অনুরোধ পেলোডের পরিবর্তে ফর্ম ডেটা হিসাবে এক্সএসআরএফ জমা দিতে পারি?

var url = 'http://somewhere.com/';
var xsrf = {fkey: 'xsrf key'};

$http({
    method: 'POST',
    url: url,
    data: xsrf
}).success(function () {});

$.ajax({
    type: 'POST',
    url: url,
    data: xsrf,
    dataType: 'json',
    success: function() {}
});

1
এটি একটি খুব দরকারী প্রশ্ন ছিল। এটি আমাকে স্ট্রিং হিসাবে একটি পে-লোড প্রেরণ করতে দেয় (কন্টেন্ট-টাইপ পরিবর্তন করে), যা পোষ্ট / জিইটি এর আগে অপশনগুলি মোকাবেলা করতে আমাকে বাধা দেয়।
আর্থলেলন

আমার একই প্রশ্ন রয়েছে, আমি ইউআরএল অনুরোধ করার পরে, তবে আমি যে প্যারামিটারটি জমা দিচ্ছি তা পেতে পারি না
黄伟杰

উত্তর:


614

নিম্নলিখিত লাইনটি পাস করা $ HT অবজেক্টে যুক্ত করা দরকার:

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

এবং পাস করা ডেটা URL- এনকোড স্ট্রিংয়ে রূপান্তর করা উচিত:

> $.param({fkey: "key"})
'fkey=key'

সুতরাং আপনার মত কিছু আছে:

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

থেকে: https://groups.google.com/forum/#!msg/angular/5nAedJ1LyO0/4Vj_72EZcDsJ

হালনাগাদ

AngularJS V1.4 এর সাথে যুক্ত নতুন পরিষেবাগুলি ব্যবহার করতে, দেখুন


3
ডেটাগুলির জসন> ইউআরএল এনকোডিংয়ের স্বয়ংক্রিয়ভাবে ঘটতে বা প্রতিটি পোস্ট বা পুট পদ্ধতির জন্য এটি ঘটতে নির্দিষ্ট করার কোনও উপায় আছে কি?
ডোগোকু

51
+1 @ এমজিবসন, আমার পক্ষে এমনকি শিরোনামগুলি পাস করাও কাজ করছিল না, যতক্ষণ না আমি আপনার উত্তরটি এতে ধারণ করে দেখছি: var xsrf = $.param({fkey: "key"});বোকা মূর্খ, কেন কৌনিকটি অভ্যন্তরীণভাবে এটি করতে পারে না?
নাইকাস

12
.জ্যাক্সের ডিফল্ট আচরণটি কাছাকাছি অনুসরণ করতে, বিষয়বস্তুর ধরণের শিরোনামে চরসেটটিও নির্দিষ্ট করা উচিত -headers: {Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
ইম্রে

25
JQuery এর পরম ফাংশনটি ব্যবহার করার পরিবর্তে, কেবলমাত্র request http অনুরোধে প্যারামের সম্পত্তি সেট করুন এবং কন্টেন্ট-টাইপ শিরোনাম যতক্ষণ 'প্রয়োগ / x-www-form-urlencoded' থাকবে ততক্ষণ jQuery.param পদ্ধতি যা করে তা করবে - স্ট্যাকওভারফ্লো .কম / প্রশ্ন / 18967307 /…
স্পিগ করুন

13
@ স্পিগ হ্যাঁ, এটি jQuery.param যা করে তা করবে, তবে আপনি যদি প্যারাম সম্পত্তি ব্যবহার করেন তবে আপনার সম্পত্তিগুলি দেহের পরিবর্তে অনুরোধ URL এর অংশ হিসাবে এনকোড হবে - এমনকি আপনি যদি অ্যাপ্লিকেশন / x-www- উল্লেখ করেছেন ফর্ম-urlencoded শিরোনাম।
stian

194

আপনি যদি সমাধানটিতে jQuery ব্যবহার না করতে চান তবে আপনি এটি চেষ্টা করে দেখতে পারেন। সমাধানটি এখান থেকে ধরা হয়েছে https://stackoverflow.com/a/1714899/1784301

$http({
    method: 'POST',
    url: url,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    transformRequest: function(obj) {
        var str = [];
        for(var p in obj)
        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
        return str.join("&");
    },
    data: xsrf
}).success(function () {});

7
এই পদ্ধতিটি আমার জন্য কৌনিক 1.2.x এ কাজ করে এবং আমি মনে করি এটি সেরা উত্তর কারণ এটি মার্জিত, এটি মূল কৌণিক ক্ষেত্রে কাজ করে এবং jQuery এর মতো কোনও বাহ্যিক গ্রন্থাগারের উপর নির্ভর করে না।
গ্রেগটকাজাপ

2
Method রিসোর্স ক্রিয়াকলাপের মধ্যে এই পদ্ধতিটি ব্যবহার করার সময় আমি একটি সমস্যার মুখোমুখি হয়েছি। ফর্ম ডেটা $ get, $ সেভ ইত্যাদির জন্য ফাংশনগুলিও অন্তর্ভুক্ত ছিল সমাধানের পরিবর্তে forস্টেটমেন্টটি কিছুটা angular.forEachপরিবর্তিত করা হয়েছিল।
অ্যান্টনি

10
নোট করুন যে para .param () এর বিপরীতে এই পদ্ধতিটি অ্যারে / অবজেক্টগুলিতে পুনরাবৃত্তভাবে কাজ করে না।
মেজেচাজার

1
আমি চেক চাই যে obj[p]নয় নাল বা অনির্দিষ্ট । অন্যথায় আপনি "নাল" বা "অপরিজ্ঞাত" স্ট্রিংটি মান হিসাবে প্রেরণ করবেন।
তামির

1
আমি বুঝতে পারিনি transformRequest: function(obj)যেহেতু আপত্তিটি অনির্ধারিত, আমরা কি xsrf পাস করার কথা মনে করি? লাইকtransformRequest: function(xsrf)
অক্ষয় তারু

92

এই সমস্যাটিকে ঘিরে অব্যাহত বিভ্রান্তি আমাকে এ সম্পর্কে একটি ব্লগ পোস্ট লিখতে অনুপ্রাণিত করেছিল। সমাধানটি আমি এই পোস্টে প্রস্তাব করছি আপনার বর্তমান শীর্ষ রেটযুক্ত সমাধানের চেয়ে ভাল কারণ এটি আপনাকে data HTTP পরিষেবা কলগুলির জন্য আপনার ডেটা অবজেক্টকে প্যারাম্যাট্রাইজ করতে সীমাবদ্ধ করে না; যেমন আমার সমাধানের সাহায্যে আপনি কেবল simply http.post () ইত্যাদিতে প্রকৃত ডেটা অবজেক্টগুলি প্রেরণ চালিয়ে যেতে পারেন এবং এখনও পছন্দসই ফলাফল অর্জন করতে পারেন।

এছাড়াও, শীর্ষ রেটিং দেওয়া উত্তরটি para .প্রেম () ফাংশনের জন্য পৃষ্ঠায় পুরো jQuery অন্তর্ভুক্তির উপর নির্ভর করে, তবে আমার সমাধানটি jQuery অজোনস্টিক, খাঁটি অ্যাঙ্গুলারজেএস প্রস্তুত।

http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/

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


10
বিস্তারিত ব্লগের জন্য +1, তবে
এটির

4
হ্যাঁ, দুটি স্তরে সম্ভবত ভয়াবহ: 1) যে AngularJS একটি ডি ফ্যাক্টো (যদিও স্বীকার করেছেন বিভ্রান্ত) মান বাড়িয়ে তোলার সিদ্ধান্ত নিয়েছে , এবং 2) যে পিএইচপি (এবং অন্যান্য সার্ভার-পাশের ভাষাগুলি যিনি জানেন) কোনওভাবে স্বয়ংক্রিয়ভাবে অ্যাপ্লিকেশন / জেএসন সনাক্ত করে না ইনপুট. : পি
এজেকিয়েল ভিক্টর

এটি কী সম্ভব যে কৌণিকুলগুলি স্বয়ংক্রিয়ভাবে সামগ্রীর ধরণের সাথে মানিয়ে নেবে এবং সে অনুযায়ী এনকোড হবে? এটা কি পূর্বে বলা হয়েছে?
unludo

4
আমি (অন্য অনেকের মতো) এটি পেরিয়ে এসেছি যে আমার ব্যাকএন্ড ASP.NETএটি 'দেশীয়ভাবে' সমর্থন করে না। আপনি যদি কৌনিক জেএস'র আচরণ পরিবর্তন করতে না চান (যা আমি করিনি, কারণ আমার এপিআই জেএসওনকে ফেরত দেয়, কেন এটি জেএসওএনকেও গ্রহণ করবে না, এটি ফর্ম ডেটার চেয়ে আরও নমনীয়) আপনি যেখান থেকে পড়তে পারেন Request.InputStreamএবং তারপরে যেকোন উপায়ে পরিচালনা করতে পারেন আপনি এটি করতে চান. (আমি dynamicসহজেই ব্যবহারের
সুবিধার্থে এটির ডিজিটালাইজেশন করা বেছে নিয়েছি

2
উজ্জীবিত কারণ এটি কোনও স্ব-নির্ভর উত্তর নয় । ভাল উত্তরগুলি অন্য কোথাও লিঙ্ক করে না। থেকে কিভাবে উত্তর দিতে : "সর্বদা একটি গুরুত্বপূর্ণ লিংক সর্বাধিক প্রাসঙ্গিক অংশ, ক্ষেত্রে লক্ষ্য সাইটে পাওয়া যাচ্ছে না বা স্থায়ীভাবে অফলাইন যায় উদ্ধৃত।"
জেমস

83

আমি অন্যান্য কয়েকটি উত্তর নিয়েছি এবং কিছুটা পরিষ্কার করেছি, .config()আপনার অ্যাপ্লিকেশনটিতে আপনার কৌণিকের শেষে এই কলটি রেখেছি mod

.config(['$httpProvider', function ($httpProvider) {
  // Intercept POST requests, convert to standard form encoding
  $httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";
  $httpProvider.defaults.transformRequest.unshift(function (data, headersGetter) {
    var key, result = [];

    if (typeof data === "string")
      return data;

    for (key in data) {
      if (data.hasOwnProperty(key))
        result.push(encodeURIComponent(key) + "=" + encodeURIComponent(data[key]));
    }
    return result.join("&");
  });
}]);

1
একটি কবজির মতো কাজ করে - কোনও সংস্থান সংজ্ঞাতে যুক্ত হলেও।
কাই ম্যাটর্ন

3
unshift()অন্যান্য রূপান্তরগুলি নিরবচ্ছিন্ন থেকে যায় তাই ব্যবহারের যত্নও নিয়েছে। ভাল কাজ.
আদিত্য এমপি

2
পারফেক্ট! আমার জন্য ভাল কাজ! দুঃখজনক কৌণিক এটিকে স্থানীয়ভাবে সমর্থন করছে না।
স্পাইরাল

2
এই উত্তরটি শীর্ষে সঠিক হওয়া উচিত, অন্যগুলি ভুল, ধন্যবাদ সাথী !!
হোসে ইগনাসিও হিটা

2
পুনরাবৃত্তির এনকোডিং সম্পর্কে কীভাবে?
পেটাহ

58

AngularJS v1.4.0 হিসাবে, একটি বিল্ট-ইন রয়েছে $httpParamSerializer পরিষেবা আছে যা ডকস পৃষ্ঠায় তালিকাভুক্ত বিধি অনুসারে কোনও বস্তুকে এইচটিটিপি অনুরোধের অংশে রূপান্তর করে ।

এটি এর মতো ব্যবহার করা যেতে পারে:

$http.post('http://example.com', $httpParamSerializer(formDataObj)).
    success(function(data){/* response status 200-299 */}).
    error(function(data){/* response status 400-999 */});

মনে রাখবেন যে একটি সঠিক ফর্ম পোস্টের জন্য Content-Type শিরোনামটি অবশ্যই পরিবর্তন করা উচিত। সমস্ত POST অনুরোধের জন্য বিশ্বব্যাপী এটি করতে, এই কোডটি (আলবিরিওর অর্ধ-উত্তর থেকে নেওয়া) ব্যবহার করা যেতে পারে:

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

কেবলমাত্র বর্তমান পোস্টের জন্য এটি করার জন্য, headersঅনুরোধ-অবজেক্টের সম্পত্তিটি পরিবর্তন করা দরকার:

var req = {
 method: 'POST',
 url: 'http://example.com',
 headers: {
   'Content-Type': 'application/x-www-form-urlencoded'
 },
 data: $httpParamSerializer(formDataObj)
};

$http(req);

আমরা কাস্টমস-রিসোর্স কারখানায় কীভাবে তা করতে পারি?
স্থিরজীবন

দ্রষ্টব্য: আমি একটি অ্যাপ্লিকেশন অ্যাঙ্গুলার 1.3 থেকে 1.5 তে আপগ্রেড করেছি। এটি রূপান্তরকরণের শিরোনামকে পরিবর্তন করেছে। কিছু কারণে উপরের পদ্ধতিটি আমার পক্ষে কাজ করে না, কৌনিকটি ইউআরএল-এনকোডযুক্ত স্ট্রিংয়ের চারপাশে ডাবল উদ্ধৃতি যুক্ত করে। সঙ্গে সমাধান transformRequest: $httpParamSerializer, data: formDataObj। সমাধানের জন্য ধন্যবাদ।
ফিল্ডো

24

আপনি বিশ্বব্যাপী আচরণটি সংজ্ঞায়িত করতে পারেন:

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

সুতরাং আপনাকে এটি প্রতিবার নতুন করে সংজ্ঞায়িত করতে হবে না:

$http.post("/handle/post", {
    foo: "FOO",
    bar: "BAR"
}).success(function (data, status, headers, config) {
    // TODO
}).error(function (data, status, headers, config) {
    // TODO
});

46
আপনার উদাহরণটি এতই ভুল ... আপনি যা কিছু পরিবর্তন করছেন তা শিরোনাম। ডেটা তারা নিজেরাই এখনও JSON- এনকোডেড এবং JSON পড়তে পারে না এমন পুরানো সার্ভারগুলির দ্বারা অপঠনযোগ্য।
অ্যালেক্স

winorblog.com/2012/12/20/… - এখানে একটি ভাল উদাহরণ যেখানে আপনি $ HTTP ডিফল্ট শিরোনামকে ওভাররাইড করবেন পাশাপাশি সেই বস্তুটিকে সিরিয়ালযুক্ত ফর্ম ডেটাতে রূপান্তর করুন।
ফেডেরিকো

20

কার্যকারণ হিসাবে আপনি সহজভাবে পোষ্ট প্রাপ্ত কোডটি অ্যাপ্লিকেশন / জেসন ডেটার প্রতিক্রিয়া জানাতে পারেন। পিএইচপি-র জন্য আমি নীচের কোডটি যুক্ত করেছি, আমাকে ফর্ম-এনকোডড বা জেএসএন-তে পোস্ট করার অনুমতি দিয়ে।

//handles JSON posted arguments and stuffs them into $_POST
//angular's $http makes JSON posts (not normal "form encoded")
$content_type_args = explode(';', $_SERVER['CONTENT_TYPE']); //parse content_type string
if ($content_type_args[0] == 'application/json')
  $_POST = json_decode(file_get_contents('php://input'),true);

//now continue to reference $_POST vars as usual

এটি সার্ভার সাইড ফিক্সের একটি ভাল উদাহরণ, কারণ এই ইস্যুতে আসল সমস্যাটি সার্ভার সাইড
এপিআইতে রয়েছে

16

এই উত্তরগুলি উন্মাদ ওভারকিলের মতো দেখায়, কখনও কখনও, সহজটি আরও ভাল:

$http.post(loginUrl, "userName=" + encodeURIComponent(email) +
                     "&password=" + encodeURIComponent(password) +
                     "&grant_type=password"
).success(function (data) {
//...

1
আমার জন্য, আমাকে এখনও শিরোনাম নির্দিষ্ট করে Content-Typeসেট করতে হয়েছিল application/x-www-form-urlencoded
ভিক্টর রামোস

9

আপনি নীচের সমাধান দিয়ে চেষ্টা করতে পারেন

$http({
        method: 'POST',
        url: url-post,
        data: data-post-object-json,
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        transformRequest: function(obj) {
            var str = [];
            for (var key in obj) {
                if (obj[key] instanceof Array) {
                    for(var idx in obj[key]){
                        var subObj = obj[key][idx];
                        for(var subKey in subObj){
                            str.push(encodeURIComponent(key) + "[" + idx + "][" + encodeURIComponent(subKey) + "]=" + encodeURIComponent(subObj[subKey]));
                        }
                    }
                }
                else {
                    str.push(encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]));
                }
            }
            return str.join("&");
        }
    }).success(function(response) {
          /* Do something */
        });

8

পোস্টের জন্য একটি অ্যাডাপ্টার পরিষেবা তৈরি করুন:

services.service('Http', function ($http) {

    var self = this

    this.post = function (url, data) {
        return $http({
            method: 'POST',
            url: url,
            data: $.param(data),
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        })
    }

}) 

এটি আপনার নিয়ামকগুলিতে বা যাই হোক না কেন ব্যবহার করুন:

ctrls.controller('PersonCtrl', function (Http /* our service */) {
    var self = this
    self.user = {name: "Ozgur", eMail: null}

    self.register = function () {
        Http.post('/user/register', self.user).then(function (r) {
            //response
            console.log(r)
        })
    }

})

para .প্রেম শুধুমাত্র jquery আবিতে। jsfiddle.net/4n9fao9q/27 $ httpParamSerializer Angularjs সমতুল্য।
ডেক্সটার

7

একটি সত্যই সুন্দর টিউটোরিয়াল রয়েছে যা এটি এবং অন্যান্য সম্পর্কিত স্টাফগুলিতে যায় - এজেএক্স ফর্মগুলি জমা দিচ্ছে: অ্যাঙ্গুলারজেএস ওয়ে

মূলত, আপনি পোষ্ট অনুরোধের শিরোনামটি সেট করতে হবে যাতে আপনি ইউআরএল এনকোড স্ট্রিং হিসাবে ফর্ম ডেটা প্রেরণ করছেন এবং একই ফর্ম্যাটটি প্রেরণ করতে ডেটা সেট করতে হবে

$http({
  method  : 'POST',
  url     : 'url',
  data    : $.param(xsrf),  // pass in data as strings
  headers : { 'Content-Type': 'application/x-www-form-urlencoded' }  // set the headers so angular passing info as form data (not request payload)
});

নোট করুন যে jQuery এর পরম () সাহায্যকারী ফাংশনটি এখানে স্ট্রিংতে ডেটা সিরিয়াল করার জন্য ব্যবহৃত হয় তবে আপনি jQuery ব্যবহার না করে নিজে নিজে এটি করতে পারেন।


1
মডারেটররা কেবলমাত্র আমার পূর্ববর্তী উত্তরটি মুছে দিয়েছে কারণ আমি লিঙ্কটিতে উল্লিখিত প্রকৃত বাস্তবায়নের বিশদ সরবরাহ করিনি। আরও ভাল হত যদি তারা প্রথমে আমাকে মুছে ফেলার পরিবর্তে আমাকে আরও বিশদ সরবরাহ করতে বলত, কারণ আমি ইতিমধ্যে এই উত্তরটিতে বর্ণিত বিবরণ সরবরাহ করার জন্য আমার উত্তরটি সম্পাদনা করছি!
রবিনমিত্রা

$.paramজাদু না। যার জন্য jQuery + AngularJS ভিত্তিক অ্যাপ রয়েছে তার নিখুঁত সমাধান।
দস্তিনিজাদ


4

Symfony2 ব্যবহারকারীদের জন্য:

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

সিমফনি \ উপাদান \ এইচটিটিপিফাউন্ডেশন \ অনুরোধ শ্রেণি প্রসারিত একটি ক্লাস তৈরি করুন:

<?php

namespace Acme\Test\MyRequest;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\ParameterBag;

class MyRequest extends Request{


/**
* Override and extend the createFromGlobals function.
* 
* 
*
* @return Request A new request
*
* @api
*/
public static function createFromGlobals()
{
  // Get what we would get from the parent
  $request = parent::createFromGlobals();

  // Add the handling for 'application/json' content type.
  if(0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/json')){

    // The json is in the content
    $cont = $request->getContent();

    $json = json_decode($cont);

    // ParameterBag must be an Array.
    if(is_object($json)) {
      $json = (array) $json;
  }
  $request->request = new ParameterBag($json);

}

return $request;

}

}

এখন আপনার অ্যাপ্লিকেশন_দেব.এফপি (অথবা আপনি যে কোনও সূচি ফাইল ব্যবহার করেন) শ্রেণিতে ব্যবহার করুন

// web/app_dev.php

$kernel = new AppKernel('dev', true);
// $kernel->loadClassCache();
$request = ForumBundleRequest::createFromGlobals();

// use your class instead
// $request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

এটি আমার কাছে সত্যিই উপকারী ছিল, নতুন ক্রিয়েটফর্মগ্লোবালগুলি এখন নিখুঁতভাবে কাজ করছে। আপনি কেন ডাউনটা পেয়েছিলেন তা আমি জানি না, তবে আমি এটি সরিয়ে দিয়েছি।
রিচার্ড

3

স্রেফ সেট করা সামগ্রী-প্রকার যথেষ্ট নয়, প্রেরণের আগে url এনকোড ফর্ম ডেটা। $http.post(url, jQuery.param(data))


3

আমি বর্তমানে নিম্নলিখিত সমাধান আমি ব্যবহার করছি পাওয়া AngularJS গুগল গ্রুপে ।

$ HTTP
.পোস্ট ('/ প্রতিধ্বনি / জেসন /', 'জসন =' + এনকোডিউআরআইসি কম্পোনেন্ট (কৌণিক.টোজসন (ডেটা)), {
    শিরোনাম: {
        'সামগ্রী-প্রকার': 'অ্যাপ্লিকেশন / x-www-form-urlencoded; charset = utf- 8 '
    }
সাফল্য (ফাংশন (ডেটা))
    $ স্কোপ.ডেটা = ডেটা;
});

মনে রাখবেন যে আপনি যদি পিএইচপি ব্যবহার করছেন তবে আপনাকে এটি Request::createFromGlobals()পড়তে সিমফনি 2 এইচটিটিপি উপাদানটির মতো কিছু ব্যবহার করতে হবে, কারণ $ _POST এটি স্বয়ংক্রিয়ভাবে লোড হবে না।


2

কৌনিক জেএসএস ঠিক অনুরোধ করে এটি HTTP- অনুরোধ শিরোনামের ভিতরে নিম্নলিখিত সামগ্রী-প্রকারের মতো করে চলেছে:

Content-Type: application/json

আপনি যদি আমার মতো পিএইচপি, বা এমনকি সিমফনি 2 এর সাথে যাচ্ছেন তবে আপনি এখানে বর্ণিত জসন স্ট্যান্ডার্ডের জন্য আপনার সার্ভারের সামঞ্জস্যতাটি কেবল বাড়িয়ে দিতে পারেন: http://silex.sensiolabs.org/doc/cookbook/json_request_body.html

সিমফনি 2 উপায় (যেমন আপনার ডিফল্ট নিয়ন্ত্রণকারী ভিতরে):

$request = $this->getRequest();
if (0 === strpos($request->headers->get('Content-Type'), 'application/json')) {
    $data = json_decode($request->getContent(), true);
    $request->request->replace(is_array($data) ? $data : array());
}
var_dump($request->request->all());

সুবিধাটি হ'ল, আপনার jQuery প্যারাম ব্যবহার করার দরকার নেই এবং আপনি AngularJS এর ​​অনুরোধগুলি করার তার নিজস্ব পদ্ধতি ব্যবহার করতে পারেন।


2

সম্পূর্ণ উত্তর (যেহেতু কৌণিক 1.4)। আপনাকে ডি নির্ভরতা অন্তর্ভুক্ত করতে হবে $ httpParamSerializer

var res = $resource(serverUrl + 'Token', { }, {
                save: { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
            });

            res.save({ }, $httpParamSerializer({ param1: 'sdsd', param2: 'sdsd' }), function (response) {

            }, function (error) { 

            });

1

আপনার অ্যাপ্লিকেশন কনফিগারেশনে -

$httpProvider.defaults.transformRequest = function (data) {
        if (data === undefined)
            return data;
        var clonedData = $.extend(true, {}, data);
        for (var property in clonedData)
            if (property.substr(0, 1) == '$')
                delete clonedData[property];

        return $.param(clonedData);
    };

আপনার সংস্থান অনুরোধ সহ -

 headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            }

0

এটি সরাসরি উত্তর নয়, বরং কিছুটা আলাদা ডিজাইনের দিকনির্দেশ:

কোনও ফর্ম হিসাবে ডেটা পোস্ট করবেন না, তবে সার্ভার-সাইড অবজেক্টে সরাসরি ম্যাপ করার জন্য একটি জেএসওএন অবজেক্ট হিসাবে বা আরআরএসটি স্টাইলের পাথ ভেরিয়েবল ব্যবহার করুন

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

http://www.someexample.com/xsrf/{xsrfKey}

কারণ প্রকৃতির দ্বারা আপনি xsrf কীটি অন্য পাথেও পাস করতে চান /login, /book-appointmentইত্যাদি ইত্যাদি এবং আপনি আপনার সুন্দর URL টি গোলযোগ করতে চান না

আকর্ষণীয়ভাবে এটি কোনও অবজেক্ট ক্ষেত্র হিসাবে যুক্ত করা উপযুক্ত নয়, কারণ এখন প্রতিটি জসন বস্তুতে আপনি সার্ভারে পাস করে আপনাকে ক্ষেত্রটি যুক্ত করতে হবে

{
  appointmentId : 23,
  name : 'Joe Citizen',
  xsrf : '...'
}

আপনি অবশ্যই আপনার সার্ভার-সাইড শ্রেণিতে অন্য কোনও ক্ষেত্র যুক্ত করতে চান না যার ডোমেন অবজেক্টের সাথে সরাসরি শব্দার্থিক সংযোগ নেই।

আমার মতে আপনার এক্সএসআরএফ কী পাস করার সর্বোত্তম উপায়টি এইচটিটিপি শিরোনামের মাধ্যমে। অনেক এক্সএসআরএফ সুরক্ষা সার্ভার-সাইড ওয়েব ফ্রেমওয়ার্ক লাইব্রেরি এটি সমর্থন করে। জাভা স্প্রিংয়ের উদাহরণস্বরূপ, আপনি এটি X-CSRF-TOKENশিরোনাম ব্যবহার করে পাস করতে পারেন

জেএস অবজেক্টকে ইউআই অবজেক্টে আবদ্ধ করার ক্ষেত্রে কৌণিকর দুর্দান্ত ক্ষমতাটির অর্থ আমরা একসাথে ফর্ম পোস্ট করার অনুশীলন থেকে মুক্তি পেতে পারি এবং এর পরিবর্তে জেএসএন পোস্ট করতে পারি। জেএসএন সহজেই সার্ভার-সাইড অবজেক্টে ডি-সিরিয়ালাইজ করা যায় এবং জটিল ডেটা স্ট্রাকচার যেমন ম্যাপ, অ্যারে, নেস্টেড অবজেক্টস ইত্যাদি সমর্থন করে can

আপনি কীভাবে ফর্ম পেইডে অ্যারে পোস্ট করবেন? সম্ভবত এটির মতো:

shopLocation=downtown&daysOpen=Monday&daysOpen=Tuesday&daysOpen=Wednesday

অথবা এটা:

shopLocation=downtwon&daysOpen=Monday,Tuesday,Wednesday

দুটোই দুর্বল ডিজাইন ..


0

এটি আমার প্রয়োজনের জন্য আমি করছি, যেখানে আমাকে ফর্ম ডেটা হিসাবে API এ লগইন ডেটা প্রেরণের প্রয়োজন এবং জাভাস্ক্রিপ্ট অবজেক্ট (ইউজারডাটা) ইউআরএল এনকোডড ডেটাতে স্বয়ংক্রিয়ভাবে রূপান্তরিত হচ্ছে

        var deferred = $q.defer();
        $http({
            method: 'POST',
            url: apiserver + '/authenticate',
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            transformRequest: function (obj) {
                var str = [];
                for (var p in obj)
                    str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
                return str.join("&");
            },
            data: userData
        }).success(function (response) {
            //logics
            deferred.resolve(response);
        }).error(function (err, status) {
           deferred.reject(err);
        });

এইভাবে আমার ইউজারডাটা

var userData = {
                grant_type: 'password',
                username: loginData.userName,
                password: loginData.password
            }

-1

আপনার thin HTTP অবজেক্ট তৈরি করার সময় আপনাকে কেবলমাত্র "পাতাগুলি" ব্যবহার করে "ডেটা" না দিয়ে সম্পত্তি পরিবর্তন করতে হবে:

$http({
   method: 'POST',
   url: serviceUrl + '/ClientUpdate',
   params: { LangUserId: userId, clientJSON: clients[i] },
})

উপরের ক্লায়েন্টগুলির উদাহরণে [i] হ'ল জেএসওএন অবজেক্ট (কোনওভাবেই সিরিয়ালাইজড নয়)। আপনি যদি "ডেটা" এর পরিবর্তে "প্যারাম" ব্যবহার করেন তবে কৌণিকটি আপনার জন্য object httpParamSerializer: https://docs.angularjs.org/api/ng/service/ $ httpParamSerializer ব্যবহার করে বস্তুটিকে সিরিয়ালাইজ করবে


2
ডেটার পরিবর্তে প্যারাম ব্যবহার করে, কৌনিক অনুরোধের বডিটির পরিবর্তে ডেটাটি ইউআরএল প্যারামিটারে রাখে। এটি কোনও ফর্ম পোস্ট থেকে প্রত্যাশিত নয়।
16-18 এ cenning

-3

AngularJS $httpপরিষেবা ব্যবহার করুন এবং এর postপদ্ধতিটি ব্যবহার করুন বা $httpফাংশনটি কনফিগার করুন।

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