উত্তর:
একই উত্স নীতিটিরPOST
(যথেষ্ট বুদ্ধিমান) সীমাবদ্ধতার কারণে অন্য ডোমেনের কোনও পরিষেবায় একটি অ্যাসিনক্রোনাস করা সম্ভব নয় । JSON-P কেবলমাত্র কাজ করে কারণ আপনাকে ডোমটিতে ট্যাগ .োকানোর অনুমতি দেওয়া হয়েছে এবং তারা যে কোনও জায়গায় নির্দেশ করতে পারে।<script>
আপনি অবশ্যই অন্য ডোমেনে একটি পৃষ্ঠা তৈরি করতে পারেন নিয়মিত ফর্ম পোষ্টের ক্রিয়া।
সম্পাদনা করুন : যদি আপনি লুকিয়ে থাকা সন্নিবেশ করানো এবং তাদের বৈশিষ্ট্যগুলি নিয়ে মাতামাতি করার প্রচেষ্টায় যেতে চান তবে সেখানে কিছু আকর্ষণীয় হ্যাক রয়েছে <iframe>
।
POST
ডোমেন এবং আপনার ব্রাউজার উভয় সমর্থন হিসাবে অন্য ডোমেনগুলিতে অনুরোধ করতে পারেন CORS
। তবে এটি সম্পূর্ণ সত্য POST
এবং JSONP
উপযুক্ত নয়।
<script>
অন্য কোনও ডোমেনের দিকে নির্দেশ করে এমন ট্যাগগুলি সন্নিবেশ করে জেএসএনপি বাস্তবায়ন করা হয় । ব্রাউজারে POST অনুরোধগুলি সম্পাদন করার একমাত্র উপায় হ'ল এইচটিএমএল ফর্ম বা এক্সএমএলএইচটিপিআরকোয়েস্টের মাধ্যমে।
আপনার যদি প্রচুর ডেটা ক্রস-ডোমেন প্রেরণের দরকার হয়। আমি সাধারণত একটি পরিষেবা তৈরি করি যা আপনি দুটি ধাপে কল করতে পারেন:
প্রথমে ক্লায়েন্ট একটি ফোরাম জমা দিন (পোস্ট অনুমোদিত ক্রস ডোমেন)। পরিষেবাটি সার্ভারে সেশনে ইনপুটটি সঞ্চয় করে (জিইউইডি কী হিসাবে ব্যবহার করে)। (ক্লায়েন্ট একটি জিইউইডি তৈরি করে এবং এটি ইনপুটটির অংশ হিসাবে প্রেরণ করে)
তারপরে ক্লায়েন্টটি প্যারামিটার হিসাবে একটি সাধারণ স্ক্রিপ্ট-ইনজেকশন (জেএসওএনপি) করেন যা আপনি ফর্ম পোস্টে ব্যবহার করেছেন সেই একই জিআইডি ব্যবহার করেন। পরিষেবাটি সেশন থেকে ইনপুটটি প্রক্রিয়া করে এবং সাধারণ জেএসএনপি-ফ্যাশনে ডেটা দেয় returns এর পরে অধিবেশনটি নষ্ট হয়ে যায়।
এটি অবশ্যই নির্ভর করে যে আপনি সার্ভার-ব্যাকএন্ড লিখেছেন।
XMLHttpRequest
মোটেই জড়িত হওয়া উচিত নয়। পার এর উত্তর পোস্টের অনুরোধটি করার জন্য নিয়মিত ফর্ম জমা ব্যবহার করে, তারপরে জিইটি অনুরোধ করার জন্য একটি স্ক্রিপ্ট উপাদান ইঞ্জেকশন।
আমি জানি যে এটি গুরুতর প্রকৃতির, তবে আমি ভেবেছিলাম যে আমি JSONP POST এর প্রয়োগটি jQuery ব্যবহার করে পোস্ট করব, যা আমি আমার জেএস উইজেটের জন্য সফলভাবে ব্যবহার করছি (এটি গ্রাহক নিবন্ধকরণ এবং লগইনের জন্য ব্যবহৃত হয়):
মূলত, আমি একটি আইফ্রেম পদ্ধতির ব্যবহার করছি, যেমন গৃহীত উত্তরের পরামর্শ দেওয়া হয়েছে। আমি আলাদাভাবে যা করছি তা অনুরোধটি প্রেরণের পরে, আমি পর্যবেক্ষণ করছি, যদি টাইমারটি ব্যবহার করে যদি ফর্মটি iframe এ পৌঁছানো যায়। যখন ফর্মটি পৌঁছানো যাবে না, তার অর্থ অনুরোধটি ফিরে এসেছে। তারপরে, আমি অপারেশনের স্থিতির সন্ধানের জন্য একটি সাধারণ জেএসওএনপি অনুরোধ ব্যবহার করছি।
আমি আশা করি যে কেউ এটির কাজে লাগবে। > = আই 8, ক্রোম, ফায়ারফক্স এবং সাফারি পরীক্ষিত।
function JSONPPostForm(form, postUrl, queryStatusUrl, queryStatusSuccessFunc, queryStatusData)
{
var tmpDiv = $('<div style="display: none;"></div>');
form.parent().append(tmpDiv);
var clonedForm = cloneForm(form);
var iframe = createIFrameWithContent(tmpDiv, clonedForm);
if (postUrl)
clonedForm.attr('action', postUrl);
var postToken = 'JSONPPOST_' + (new Date).getTime();
clonedForm.attr('id', postToken);
clonedForm.append('<input name="JSONPPOSTToken" value="'+postToken+'">');
clonedForm.attr('id', postToken );
clonedForm.submit();
var timerId;
var watchIFrameRedirectHelper = function()
{
if (watchIFrameRedirect(iframe, postToken ))
{
clearInterval(timerId);
tmpDiv.remove();
$.ajax({
url: queryStatusUrl,
data: queryStatusData,
dataType: "jsonp",
type: "GET",
success: queryStatusSuccessFunc
});
}
}
if (queryStatusUrl && queryStatusSuccessFunc)
timerId = setInterval(watchIFrameRedirectHelper, 200);
}
function createIFrameWithContent(parent, content)
{
var iframe = $('<iframe></iframe>');
parent.append(iframe);
if (!iframe.contents().find('body').length)
{
//For certain IE versions that do not create document content...
var doc = iframe.contents().get()[0];
doc.open();
doc.close();
}
iframe.contents().find('body').append(content);
return iframe;
}
function watchIFrameRedirect(iframe, formId)
{
try
{
if (iframe.contents().find('form[id="' + formId + '"]').length)
return false;
else
return true;
}
catch (err)
{
return true;
}
return false;
}
//This one clones only form, without other HTML markup
function cloneForm(form)
{
var clonedForm = $('<form></form>');
//Copy form attributes
$.each(form.get()[0].attributes, function(i, attr)
{
clonedForm.attr(attr.name, attr.value);
});
form.find('input, select, textarea').each(function()
{
clonedForm.append($(this).clone());
});
return clonedForm;
}
ভাল সাধারণত জেএসওএনপি <script>
কলিং ডকুমেন্টে একটি ট্যাগ যুক্ত করে প্রয়োগ করা হয় , যেমন JSONP পরিষেবার URL টি "src" " ব্রাউজারটি একটি HTTP জিইটি লেনদেনের সাথে স্ক্রিপ্ট উত্সটি নিয়ে আসে।
এখন, যদি আপনার JSONP পরিষেবাটি আপনার কলিং পৃষ্ঠার একই ডোমেনে থাকে, তবে আপনি সম্ভবত একটি সাধারণ $.ajax()
কল দিয়ে কিছু মিলিয়ে দেখতে পারেন । যদি এটি একই ডোমেইনে না থাকে, তবে কীভাবে এটি সম্ভব হবে তা আমি নিশ্চিত নই।
CORS
তবে ব্রাউজারটি যতক্ষণ সমর্থন করে ততক্ষণ এটি সম্ভব হবে। এই ক্ষেত্রে আপনি JSON
পরিবর্তে প্লেইন ব্যবহার করবেন JSONP
।
আপনি এই প্রকল্পটি ব্যবহার করে একটি কর্স প্রক্সি ব্যবহার করতে পারেন । এটি সমস্ত ট্র্যাফিককে আপনার ডোমেনের একটি শেষ পয়েন্টে পরিচালিত করবে এবং সেই তথ্যটি একটি বাহ্যিক ডোমেনে রিলে করবে। যেহেতু ব্রাউজারটি একই ডোমেনে থাকার জন্য সমস্ত অনুরোধগুলি নিবন্ধভুক্ত করছে আমরা জেএসএন পোস্ট করতে সক্ষম। দ্রষ্টব্য: এটি সার্ভারে থাকা এসএসএল শংসাপত্রগুলির সাথেও কাজ করে।
এর একটি (হ্যাক) সমাধান রয়েছে যা আমি এটি বহুবার করেছি, আপনি জসনপি দিয়ে পোস্ট করতে সক্ষম হবেন। (আপনি জিইটি দ্বারা ব্যবহারের চেয়ে 2000 চরের চেয়ে বড় ফর্ম পোস্ট করতে সক্ষম হবেন)
ক্লায়েন্ট অ্যাপ্লিকেশন জাভাস্ক্রিপ্ট
$.ajax({
type: "POST", // you request will be a post request
data: postData, // javascript object with all my params
url: COMAPIURL, // my backoffice comunication api url
dataType: "jsonp", // datatype can be json or jsonp
success: function(result){
console.dir(result);
}
});
জাভা:
response.addHeader( "Access-Control-Allow-Origin", "*" ); // open your api to any client
response.addHeader( "Access-Control-Allow-Methods", "POST" ); // a allow post
response.addHeader( "Access-Control-Max-Age", "1000" ); // time from request to response before timeout
পিএইচপি:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Max-Age: 1000');
এটি করে আপনি কোনও সার্ভারের অনুরোধের জন্য আপনার সার্ভারটি খুলছেন, আপনাকে পরিচয় বা অন্য কিছু সরবরাহ করে এটি পুনরায় সুরক্ষিত করা উচিত।
এই পদ্ধতির সাহায্যে আপনি অনুরোধের প্রকারটি jsonp থেকে json এ পরিবর্তন করতে পারেন, উভয়ই কাজ করেন, কেবল সঠিক প্রতিক্রিয়া সামগ্রী প্রকার সেট করুন
jsonp
response.setContentType( "text/javascript; charset=utf-8" );
JSON
response.setContentType( "application/json; charset=utf-8" );
আপনি সার্ভার আর এসওপি (একই উত্স নীতি) সম্মান করবে না দয়া করে, কিন্তু কে যত্ন?
<script>
আপনার এইচটিএমএল ডিওমে কেবল ইনজেকশন ট্যাগের বাইরে জেএসএন এবং জেএসএনপি উভয় ডেটা নোটেশন ব্যবহার করতে পারেন (হ্যাক আপনি এমনকি এটি কোনও ডেস্কটপ অ্যাপ্লিকেশনগুলিতে ব্যবহার করতে পারেন, বলুন যে আপনি একই সার্ভারে একাধিক জেএসএন অনুরোধ করতে চেয়েছিলেন, এবং ফাংশনটির নামটি ব্যবহার করতে চেয়েছিলেন উদাহরণস্বরূপ একটি অনুরোধ ট্র্যাকিং আইডি হিসাবে)।
এটা সম্ভব, এখানে আমার সমাধান:
আপনার জাভাস্ক্রিপ্টে:
jQuery.post("url.php",data).complete(function(data) {
eval(data.responseText.trim());
});
function handleRequest(data){
....
}
আপনার url.php এ:
echo "handleRequest(".$responseData.")";