javascript - AngularJS-$ http.post এর জন্য JSON পরিবর্তে অনুরোধ পরামিতি পাঠানোর জন্য কোন উপায়?
jquery (9)
AngularJS v1.4.8 + (v1.5.0) জন্য সিনট্যাক্স
$http.post(url, data, config)
.then(
function (response) {
// success callback
},
function (response) {
// failure callback
}
);
উদাহরণ:
var url = "http://example.com";
var data = {
"param1": "value1",
"param2": "value2",
"param3": "value3"
};
var config = {
headers: {
'Content-Type': "application/json"
}
};
$http.post(url, data, config)
.then(
function (response) {
// success callback
},
function (response) {
// failure callback
}
);
আমার কিছু পুরনো কোড রয়েছে যা jQuery এর পোস্ট পদ্ধতির মাধ্যমে একটি AJAX পোস্ট অনুরোধ করে এবং এটি এমন কিছু দেখায়:
$.post("/foo/bar", requestData,
function(responseData)
{
//do stuff with response
}
requestData
কিছু মৌলিক স্ট্রিং বৈশিষ্ট্য সঙ্গে শুধুমাত্র একটি জাভাস্ক্রিপ্ট বস্তু।
আমি কৌণিক ব্যবহার করার জন্য আমাদের স্টাফ উপর সরানোর প্রক্রিয়া করছি, এবং আমি $ http.post সঙ্গে এই কল প্রতিস্থাপন করতে চান। আমি নিম্নলিখিত সঙ্গে এসেছিলেন:
$http.post("/foo/bar", requestData).success(
function(responseData) {
//do stuff with response
}
});
যখন আমি এটি করেছি, আমি সার্ভার থেকে 500 ত্রুটি প্রতিক্রিয়া পেয়েছিলাম। ফায়ারবগ ব্যবহার করে, আমি দেখেছি যে এটি এইরকম অনুরোধ সংস্থা পাঠিয়েছে:
{"param1":"value1","param2":"value2","param3":"value3"}
সফল jQuery $.post
শরীরকে এই রকম পাঠায়:
param1=value1¶m2=value2¶m3=value3
আমি আঘাত করছি endpoint অনুরোধ অনুরোধ পরামিতি এবং JSON নয়। সুতরাং, আমার প্রশ্নটি $http.post
পরিবর্তে জাভাস্ক্রিপ্ট অবজেক্টটি JSON এর পরিবর্তে অনুরোধ প্যারামিটার হিসাবে পাঠানোর জন্য $http.post
বলার আছে কি? হ্যাঁ, আমি জানি বস্তু থেকে আমি নিজেকে স্ট্রিংটি গঠন করতে পারি, কিন্তু আমি জানতে চাই যে কেঙ্গুলার বাক্সের বাইরে এই জন্য কিছু সরবরাহ করে কিনা।
AngularJS ডকুমেন্টেশন থেকে:
প্যারামস - {বস্তু।} - স্ট্রিং বা বস্তুর মানচিত্র যা url এর পরে key1 = value1 এবং key2 = value2 চালু হবে। মান একটি স্ট্রিং না হলে , এটি JSONified করা হবে।
সুতরাং, পরামিতি হিসাবে স্ট্রিং প্রদান। আপনি যদি চান না, তাহলে রূপান্তর ব্যবহার করুন। আবার, ডকুমেন্টেশন থেকে:
স্থানীয়ভাবে এই রূপান্তরটি ওভাররাইড করার জন্য, রূপান্তর ফাংশনকে রূপান্তর রেখার এবং / অথবা কনফিগ অবজেক্টের ট্রান্সফরম রেসপন্স বৈশিষ্ট্য হিসাবে উল্লেখ করুন। বিশ্বব্যাপী ডিফল্ট রূপান্তরগুলি ওভাররাইড করতে, $ httpProvider.defaults.transformRequest ও $ httpProvider.defaults.transformResponse $ httpProvider এর বৈশিষ্ট্যগুলিকে ওভাররাইড করুন।
আরো বিস্তারিত জানার জন্য documentation পড়ুন।
অ্যানুয়াল 1.4 হিসাবে, আপনি jQuery ব্যবহার না করে ফর্ম তথ্য serialize করতে পারেন যে নোট করুন।
App.js মধ্যে:
module.run(function($http, $httpParamSerializerJQLike) {
$http.defaults.transformRequest.unshift($httpParamSerializerJQLike);
});
তারপর আপনার নিয়ামক মধ্যে:
$http({
method: 'POST',
url: myUrl',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
data: myData
});
আপনি সার্ভারে কোড পরিবর্তন না করে $http.post
কল এ শিরোনাম পরিবর্তন করে এবং নিয়মিত ভাবে $_POST
ব্যবহার করেও এই সমস্যার সমাধান করতে পারেন। এখানে ব্যাখ্যা করা হয়েছে: http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/
আমি কাস্টম http প্রমাণীকরণ সেটিং পাশাপাশি সমস্যা আছে কারণ অনুরোধ $ সম্পদ ক্যাশে।
এটি কাজ করার জন্য আপনাকে এটি করে বিদ্যমান শিরোনামগুলি ওভাররাইট করতে হবে
var transformRequest = function(data, headersGetter){
var headers = headersGetter();
headers['Authorization'] = 'WSSE profile="UsernameToken"';
headers['X-WSSE'] = 'UsernameToken ' + nonce
headers['Content-Type'] = 'application/json';
};
return $resource(
url,
{
},
{
query: {
method: 'POST',
url: apiURL + '/profile',
transformRequest: transformRequest,
params: {userId: '@userId'}
},
}
);
আমি আশা করি আমি কাউকে সাহায্য করতে পারব। এটি একটি এক খুঁজে বের করতে আমাকে 3 দিন সময় লেগেছে।
আমি মনে করি params
কনফিগার প্যারামিটারটি এখানে কাজ করবে না কারণ এটি শরীরের পরিবর্তে ইউআরএলটিতে স্ট্রিং যোগ করে তবে ইনফিলিগো এখানে কীভাবে সুপারিশ করেছে তা ডিফল্ট ট্রান্সফর্মের গ্লোবাল ওভার্রাইডের একটি উদাহরণ (উদাহরণস্বরূপ jQuery param ব্যবহার করে তথ্য প্যারামিটার স্ট্রিং রূপান্তর)।
বিশ্বব্যাপী রূপান্তর সেটআপ ফাংশন:
var app = angular.module('myApp');
app.config(function ($httpProvider) {
$httpProvider.defaults.transformRequest = function(data){
if (data === undefined) {
return data;
}
return $.param(data);
}
});
যেভাবেই http.post এ সমস্ত কল স্বয়ংক্রিয়ভাবে শরীরের একই প্যারামিটার ফরম্যাটে jQuery $.post
। পোস্ট কল দ্বারা ব্যবহৃত হয়।
মনে রাখবেন আপনি প্রতি কল-সামগ্রী শিরোনাম প্রতি কল বা বিশ্বব্যাপী এটি সেট করতে চাইতে পারেন:
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
নমুনা অ গ্লোবাল ট্রান্সফর্ম প্রতি কল প্রতি:
var transform = function(data){
return $.param(data);
}
$http.post("/foo/bar", requestData, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
transformRequest: transform
}).success(function(responseData) {
//do stuff with response
});
ডিফল্ট শিরোনাম সংশোধন করুন:
$http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8";
তারপর JQuery এর $.param
পদ্ধতি ব্যবহার করুন:
var payload = $.param({key: value});
$http.post(targetURL, payload);
দ্রুত সমন্বয় - আপনার মধ্যে যারা ট্রান্সফর্মরুভেস্ট ফাংশনের বিশ্বব্যাপী কনফিগারেশনে সমস্যা হচ্ছে তাদের জন্য এখানে আমি যে স্নিপেটটি ব্যবহার করছি তা থেকে মুক্ত হতে এখানে Cannot read property 'jquery' of undefined
ত্রুটির Cannot read property 'jquery' of undefined
:
$httpProvider.defaults.transformRequest = function(data) {
return data != undefined ? $.param(data) : null;
}
.controller('pieChartController', ['$scope', '$http', '$httpParamSerializerJQLike', function($scope, $http, $httpParamSerializerJQLike) {
var data = {
TimeStamp : "2016-04-25 12:50:00"
};
$http({
method: 'POST',
url: 'serverutilizationreport',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
data: $httpParamSerializerJQLike(data),
}).success(function () {});
}
]);