আমি কীভাবে জাভাস্ক্রিপ্টের মাধ্যমে ক্রস-ডোমেন POST অনুরোধ পাঠাব?


568

আমি কীভাবে জাভাস্ক্রিপ্টের মাধ্যমে ক্রস-ডোমেন POST অনুরোধ পাঠাব?

নোটস - এটি পৃষ্ঠাটি রিফ্রেশ করা উচিত নয় এবং এর পরে আমাকে প্রতিক্রিয়াটি ধরা এবং পার্স করা দরকার।


আমি ব্যবহারের কেস সম্পর্কে কিছুটা জানতে চাই যা আপনাকে এটি করার চেষ্টা করতে দেয়। আপনি দয়া করে এটি সম্পর্কে কিছু বলতে পারেন?
mkoeller

মূলত আমি এমন একটি স্ক্রিপ্টে কাজ করছি যা প্রক্রিয়াকরণের জন্য এইচটিএমএল ফাইল থেকে কিছু পাঠ্য অন্য সার্ভারে প্রেরণ করা দরকার।
ইডো শ্যাচাম

3
আপনি কি এমন একটি প্রক্সি সেট আপ করতে পারেন যা এটি সার্ভার-সাইডে করে এবং কেবল আপনার স্ক্রিপ্টকে ফলাফল দেয়? বা এটি কি 100% জাভাস্ক্রিপ্ট হওয়া দরকার?
সাশা চেদিগোভ

উত্তর:


382

আপডেট: চালিয়ে যাওয়ার আগে প্রত্যেকের CORS এর html5rocks টিউটোরিয়ালটি পড়া এবং বুঝতে হবে । এটি বোঝা সহজ এবং খুব পরিষ্কার।

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

সংক্ষেপে এখানে আপনি কীভাবে ক্রম ডোমেন পোস্টটি পোষ্টটি পোস্ট করুন / ডটকম থেকে html থেকে.com/postHere.php (উদাহরণ হিসাবে পিএইচপি ব্যবহার করে) করছেন। দ্রষ্টব্য: আপনাকে কেবল Access-Control-Allow-Originনন OPTIONSঅনুরোধের জন্য সেট করতে হবে - এই উদাহরণটি সর্বদা একটি ছোট কোড স্নিপেটের জন্য সমস্ত শিরোনাম সেট করে।

  1. পোস্টহির.এফপি নিম্নলিখিত পদ্ধতিতে সেটআপ করুন:

    switch ($_SERVER['HTTP_ORIGIN']) {
        case 'http://from.com': case 'https://from.com':
        header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
        header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
        header('Access-Control-Max-Age: 1000');
        header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
        break;
    }

    এটি আপনার স্ক্রিপ্টকে ক্রস ডোমেন POST, GET এবং বিকল্পগুলি তৈরি করতে দেয়। আপনি পড়া চালিয়ে যাওয়ার সাথে সাথে এটি পরিষ্কার হয়ে যাবে ...

  2. জেএস (jQuery উদাহরণ) থেকে আপনার ক্রস ডোমেন POST সেটআপ করুন:

    $.ajax({
        type: 'POST',
        url: 'https://to.com/postHere.php',
        crossDomain: true,
        data: '{"some":"json"}',
        dataType: 'json',
        success: function(responseData, textStatus, jqXHR) {
            var value = responseData.someKey;
        },
        error: function (responseData, textStatus, errorThrown) {
            alert('POST failed.');
        }
    });

আপনি যখন পদক্ষেপ 2-এ পোস্ট করেন, আপনার ব্রাউজার সার্ভারে একটি "বিকল্প" পদ্ধতি প্রেরণ করবে। এটি সার্ভারটি পোষ্ট করে আপনার সাথে শীতল কিনা তা দেখার জন্য এটি ব্রাউজারের দ্বারা একটি "স্নিফ"। সার্ভারটি "অ্যাক্সেস-কন্ট্রোল-অলজিন-অরিজিন" দিয়ে ব্রাউজারকে পোস্ট করুন | GET | ORIGIN- এ অনুরোধ জানায় যদি অনুরোধটি " http://from.com " বা " https://from.com " থেকে উত্পন্ন হয় with যেহেতু সার্ভারটি এটির সাথে ঠিক আছে, তাই ব্রাউজারটি একটি দ্বিতীয় অনুরোধ করবে (এবার একটি পোষ্ট করুন)। আপনার ক্লায়েন্টটি যে সামগ্রী পাঠাচ্ছে সেটি সেট করা ভাল অনুশীলন - সুতরাং আপনাকে এটিরও অনুমতি দেওয়া দরকার।

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

আপনি যদি এটি করেন তবে নিম্নলিখিত বিষয়গুলি মনে রাখবেন:

  1. আপনার সার্ভারে অপারেশন অনুযায়ী 2 টি অনুরোধ পরিচালনা করতে হবে
  2. সুরক্ষা সম্পর্কিত প্রভাব সম্পর্কে আপনাকে ভাবতে হবে। 'অ্যাক্সেস-নিয়ন্ত্রণ-মঞ্জুরি-উত্স: *' এর মতো কিছু করার আগে সাবধান হন
  3. এটি মোবাইল ব্রাউজারগুলিতে কাজ করবে না। আমার অভিজ্ঞতায় তারা ক্রস ডোমেন পোষ্টকে মোটেই অনুমতি দেয় না। আমি অ্যান্ড্রয়েড, আইপ্যাড, আইফোন পরীক্ষা করেছি
  4. এফএফ <3.6 এ একটি দুর্দান্ত বড় বাগ রয়েছে যেখানে সার্ভারটি যদি 400 টি নন প্রতিক্রিয়া কোড দেয় এবং সেখানে একটি প্রতিক্রিয়া বডি থাকে (উদাহরণস্বরূপ বৈধতা ত্রুটি), এফএফ 3.6 প্রতিক্রিয়া দেবে না। এটি পাছার একটি বিশাল ব্যথা, যেহেতু আপনি ভাল বিশ্রামের অভ্যাসগুলি ব্যবহার করতে পারবেন না। বাগটি এখানে দেখুন (এটি jQuery এর অধীনে দায়ের করা হয়েছে , তবে আমার অনুমান এটির একটি এফএফ বাগ - এফএফ 4 এ স্থির বলে মনে হচ্ছে)।
  5. উপরের শিরোনামকে সর্বদা ফিরিয়ে দিন, কেবলমাত্র বিকল্পের অনুরোধগুলিতে নয়। পোষ্টের প্রতিক্রিয়াতে এফএফের এটির প্রয়োজন।

এটি উদাহরণস্বরূপ html ফিরে আসতে পারে? আমাকে এইচটিএমএল ফিরে আসতে হবে এবং কিছু কাজ করছে না ...
অস্বীকার

হ্যাঁ আপনি সক্ষম হতে হবে। কখনও চেষ্টা করে দেখুন। আপনার সার্ভার 200 ফিরে? এছাড়াও কি আপনার সার্ভার অপশন এবং পোস্টের অনুরোধগুলিতে শিরোনামগুলি ফিরিয়ে দিচ্ছে? আমি এই সম্পর্কে আরও বিশদ সহ আমার উত্তর আপডেট করেছি। নিশ্চিত করুন যে আপনার সার্ভারটিও সঠিক সামগ্রী-প্রকারের শিরোনামের সাথে সাড়া দিচ্ছে (যেমন পাঠ্য / এইচটিএমএল)। আমার পুনঃবৃদ্ধিটি হ'ল গুগল ক্রোম ব্যবহার করা, ডান ক্লিক পৃষ্ঠা> উপাদানটি পরীক্ষা করুন। নেটওয়ার্ক ট্যাবে ক্লিক করুন, এবং পোস্ট এবং প্রতিক্রিয়াটি দেখুন। আপনার কী ভুল হচ্ছে সে সম্পর্কে আপনাকে তথ্য দেওয়া উচিত।
rynop

আমি এই চেষ্টা করেছি, কিন্তু এখনও পেতে 400 Bad Requestউপর OPTIONSঅনুরোধ। এবং firefoxদ্বিতীয় অনুরোধ POSTকখনও করা হয় না। :(
জয়ন শাইখ

উপরে আপনার কেস স্টেটমেন্টে আপনার লোকাল মেশিনকে কলআউট করার কোনও উপায় আছে? অথবা আপনাকে কেবল অনুমতি ব্যবহারের জন্য এই ক্ষেত্রে * ব্যবহার করতে হবে।
টড ভ্যানস

1
এটি সর্বশেষ 4 বছর আগে সম্পাদিত হয়েছিল - এটি এখন মোবাইল ব্রাউজারগুলিতে কাজ করবে?
ফ্র্যাঙ্কপিন্টো

121

আপনি যদি রিমোট সার্ভারটি নিয়ন্ত্রণ করেন তবে আপনার উত্তরটি সম্ভবত বর্ণিত হিসাবে CORS ব্যবহার করা উচিত ; এটি IE8 এবং তারপরে এবং এফএফ, জিসি এবং সাফারি এর সর্বশেষ সংস্করণে সমর্থিত। (তবে আইই 8 এবং 9-তে, সিওআরএস আপনাকে অনুরোধে কুকিজ পাঠানোর অনুমতি দেবে না))

সুতরাং, আপনি যদি রিমোট সার্ভারটি নিয়ন্ত্রণ না করেন, বা আপনার যদি আই 7 সমর্থন করতে হয়, বা আপনার যদি কুকিজের প্রয়োজন হয় এবং আপনার আইই 8/9 সমর্থন করতে হয় তবে আপনি সম্ভবত একটি আইফ্রেমে কৌশল ব্যবহার করতে চাইবেন।

  1. একটি অনন্য নাম দিয়ে একটি iframe তৈরি করুন। (iframes পুরো ব্রাউজারের জন্য একটি বিশ্বব্যাপী নেমস্পেস ব্যবহার করে, তাই এমন কোনও নাম চয়ন করুন যা অন্য কোনও ওয়েবসাইট ব্যবহার করবে না))
  2. লুকানো ইনপুটগুলি সহ একটি ফর্ম তৈরি করুন, iframe লক্ষ্য করে।
  3. ফর্ম জমা দিন।

এখানে নমুনা কোড; আমি এটি আই 6, আই 7, আই 8, আই 9, এফ এফ 4, জিসি 11, এস 5 এ পরীক্ষা করেছি।

function crossDomainPost() {
  // Add the iframe with a unique name
  var iframe = document.createElement("iframe");
  var uniqueString = "CHANGE_THIS_TO_SOME_UNIQUE_STRING";
  document.body.appendChild(iframe);
  iframe.style.display = "none";
  iframe.contentWindow.name = uniqueString;

  // construct a form with hidden inputs, targeting the iframe
  var form = document.createElement("form");
  form.target = uniqueString;
  form.action = "http://INSERT_YOUR_URL_HERE";
  form.method = "POST";

  // repeat for each parameter
  var input = document.createElement("input");
  input.type = "hidden";
  input.name = "INSERT_YOUR_PARAMETER_NAME_HERE";
  input.value = "INSERT_YOUR_PARAMETER_VALUE_HERE";
  form.appendChild(input);

  document.body.appendChild(form);
  form.submit();
}

সতর্ক থাকুন! আপনি পোষ্টের প্রতিক্রিয়া সরাসরি পড়তে পারবেন না, যেহেতু আলাদা আলাদা ডোমেনে আইফ্রেম বিদ্যমান রয়েছে। ফ্রেমগুলিকে বিভিন্ন ডোমেন থেকে একে অপরের সাথে যোগাযোগের অনুমতি দেওয়া হয় না; এটি একই-উত্স নীতি

যদি আপনি রিমোট সার্ভারটি নিয়ন্ত্রণ করেন তবে আপনি কর ব্যবহার করতে পারবেন না (উদাহরণস্বরূপ আপনি IE8 / IE9 এ আছেন এবং আপনার কুকিজ ব্যবহার করা দরকার), একই-উত্স নীতিটি ব্যবহার করার উপায় রয়েছে, উদাহরণস্বরূপ ব্যবহার করে window.postMessageএবং / অথবা পুরানো ব্রাউজারগুলিতে ক্রস-ডোমেন ক্রস-ফ্রেম বার্তা প্রেরণে মঞ্জুরি দেয় এমন একটি লাইব্রেরির মধ্যে একটি:

আপনি যদি রিমোট সার্ভারটি নিয়ন্ত্রণ করেন না, তবে আপনি POST, পিরিয়ডের প্রতিক্রিয়াটি পড়তে পারবেন না। এটি অন্যথায় সুরক্ষার সমস্যার কারণ হতে পারে।


2
আপনাকে কিছু রূপের জন্য form.target সেট করতে হবে, অন্যথায় ব্রাউজারটি আপনার সাইট থেকে ফর্ম ক্রিয়া URL এ নেভিগেট করবে। তদুপরি, স্ট্রিংটি অনন্য হতে হবে; যদি একই নাম ব্যবহার করে অন্য ফ্রেম বা উইন্ডোজ থাকে তবে ফর্মটি আপনার আইফ্রেমের পরিবর্তে সেই উইন্ডোতে পোস্ট করতে পারে। তবে এটি কতটা অনন্য হতে হবে? সম্ভবত খুব না। ক্লোবার্বিংয়ের প্রতিক্রিয়াগুলি বেশ ছোট। অসহায়তা
ড্যান Fabulich

1
@ নাওয়াজ যেমন আমি আমার উত্তরে বলেছি, আপনার ওয়েব পৃষ্ঠায় ফলাফল পেতে আপনাকে ক্রস-ডোমেন ক্রস-ফ্রেম যোগাযোগ করতে হবে। এটির জন্য আপনাকে দূরবর্তী ওয়েব সার্ভারটি নিয়ন্ত্রণ করতে হবে যাতে আপনি আপনার ওয়েব পৃষ্ঠার সাথে যোগাযোগের অনুমতি দেওয়ার জন্য এর প্রতিক্রিয়াটি পরিবর্তন করতে পারেন। (একটি জিনিসের জন্য, সার্ভারের এইচটিএমএল দিয়ে জবাব দেওয়া দরকার; সার্ভার যদি কাঁচা এক্সএমএল দিয়ে উত্তর দেয় তবে এটি ক্রস-ফ্রেম যোগাযোগ করতে পারে না))
ড্যান ফাবুলিচ

1
+1 - এটি সার্ভারে অ্যাক্সেস না থাকলে আমি খুঁজে পেয়েছি এটি সেরা সমাধান
জেমস লং

1
@ ভোজটেকবি না, এটি সিকিউরিটি গর্ত হবে।
ড্যান ফাবুলিচ

1
@ এন্ডরাস আপনি পোষ্টের ফলাফলটি পড়তে পারেন, তবে আপনি যদি সার্ভারটি নিয়ন্ত্রণ করেন তবেই! এই উত্তরে দেখুন, এতে বলা হয়েছে "প্রেরকের [ক্লায়েন্ট] এর উপর এক্স করুন, রিসিভার [সার্ভার] এ ওয়াই করুন"। আপনি যদি রিসিভার / সার্ভারটি নিয়ন্ত্রণ না করেন তবে আপনি ওয়াই করতে পারবেন না এবং তাই আপনি পোষ্টের ফলাফলটি পড়তে পারবেন না।
ড্যান ফাবুলিচ 14:53

48
  1. একটি আইফ্রেম তৈরি করুন,
  2. লুকানো ইনপুট সহ এটিতে একটি ফর্ম রাখুন,
  3. URL- এ ফর্মটির ক্রিয়া সেট করুন,
  4. নথিতে iframe যুক্ত করুন
  5. ফর্ম জমা দিন

সুডোকোড

 var ifr = document.createElement('iframe');
 var frm = document.createElement('form');
 frm.setAttribute("action", "yoururl");
 frm.setAttribute("method", "post");

 // create hidden inputs, add them
 // not shown, but similar (create, setAttribute, appendChild)

 ifr.appendChild(frm);
 document.body.appendChild(ifr);
 frm.submit();

আপনি সম্ভবত আইফ্রেমে স্টাইল করতে চান, গোপন এবং একেবারে অবস্থানযুক্ত হতে। নিশ্চিত নয় যে ক্রস সাইট পোস্টিং ব্রাউজারের দ্বারা অনুমোদিত হবে, তবে যদি তা হয় তবে এটি এটি কিভাবে হয়।


4
প্রকৃতপক্ষে, এটি সামান্য ত্রুটিযুক্ত, যেহেতু ifr.appendChild (frm); কাজ করবে না. iframe একটি উইন্ডো অবজেক্টের একটি রেফারেন্স এবং এটির জন্য অ্যাপেন্ডচাইল্ড পদ্ধতি বিদ্যমান নেই। আপনাকে প্রথমে iframe এ নথি নোডটি ধরতে হবে। এটি ব্রাউজার জুড়ে কাজ করতে বৈশিষ্ট্য সনাক্তকরণ প্রয়োজন।
রাকেশ পাই

ধন্যবাদ। বিষয়টি সম্পর্কিত এই দরকারী লিঙ্কগুলি খুঁজে পেয়েছে : bindzus.wordpress.com/2007/12/24/… বিকাশকারী.অ্যাপল.
ইডো শ্যাচাম

19
সমস্যা নেই! আইফ্রেমে প্রাপ্ত প্রতিক্রিয়াটি একটি অন্য ডোমেনে থাকে, সুতরাং মূল উইন্ডোটিতে এটির কোনও অ্যাক্সেস নেই, তবে আইফ্রেমেও মূল উইন্ডোটিতে অ্যাক্সেস নেই। সুতরাং এই সমাধানটি কেবল পোস্ট করার জন্য ভাল বলে মনে হচ্ছে তবে আপনি পরে প্রতিক্রিয়াটি পার্স করতে পারবেন না :(
ইডো শ্যাচাম

2
জাভাস্ক্রিপ্ট ফাংশনটিতে প্রতিক্রিয়ার বডি ট্যাগে একটি অ্যান্ডলোড সেট করার চেষ্টা করুন যা প্রতিক্রিয়ার স্ট্রিং সহ পিতামাতার একটি ফাংশনকে ডাকে।
লু ফ্রাঙ্কো

এই উত্তরটি আমার পক্ষে কার্যকর হয়নি; আমি নীচে আমার নিজস্ব প্রকরণ পোস্ট করেছি।
ড্যান ফাবুলিচ

24

সহজবোধ্য রাখো:

  1. ক্রস-ডোমেন পোস্ট:
    ব্যবহার করুনcrossDomain: true,

  2. পৃষ্ঠাটি রিফ্রেশ করা উচিত নয়:
    না, এটা যেমন পৃষ্ঠাটি রিফ্রেশ করা হবে নাsuccessবাerrorকলব্যাক ASYNC বলা হবে যখন সার্ভার পাঠাতে ফিরে প্রতিক্রিয়া।


উদাহরণ লিপি:

$.ajax({
        type: "POST",
        url: "http://www.yoururl.com/",
        crossDomain: true,
        data: 'param1=value1&param2=value2',
        success: function (data) {
            // do something with server response data
        },
        error: function (err) {
            // handle your error logic here
        }
    });

8
crossDomain: trueঅদ্ভুতভাবে সত্যিকারের ক্রস-ডোমেন অনুরোধগুলির সাথে কিছুই করার নেই। যদি অনুরোধটি ক্রস-ডোমেন হয় তবে jquery এটিকে স্বয়ংক্রিয়ভাবে সত্যে সেট করে।
কেভিন বি

16

আপনার যদি জড়িত সমস্ত সার্ভারে অ্যাক্সেস থাকে তবে অন্য ডোমেনে অনুরোধ করা পৃষ্ঠার উত্তরটির শিরোনামে নিম্নলিখিতটি লিখুন:

পিএইচপি:

header('Access-Control-Allow-Origin: *');

উদাহরণস্বরূপ, দ্রুপালের xmlrpc.php কোডে আপনি এটি করতে পারেন:

function xmlrpc_server_output($xml) {
    $xml = '<?xml version="1.0"?>'."\n". $xml;
    header('Connection: close');
    header('Content-Length: '. strlen($xml));
    header('Access-Control-Allow-Origin: *');
    header('Content-Type: application/x-www-form-urlencoded');
    header('Date: '. date('r'));
    // $xml = str_replace("\n", " ", $xml); 

    echo $xml;
    exit;
}

এটি সম্ভবত একটি সুরক্ষা সমস্যা তৈরি করে এবং আপনার অনুরোধটি যাচাই করার জন্য যথাযথ ব্যবস্থা গ্রহণ করা উচিত তা নিশ্চিত করা উচিত।



6
  1. দুটি লুকানো আইফ্র্যাম তৈরি করুন (CSS শৈলীতে "প্রদর্শন: কিছুই নয়" যোগ করুন)। আপনার নিজের ডোমেনের কিছুতে আপনার দ্বিতীয় iframe পয়েন্ট করুন।

  2. একটি লুকানো ফর্ম তৈরি করুন, তার পদ্ধতিটি "পোস্ট" এ সেট করুন = আপনার প্রথম আইফ্রেমে সাথে, এবং বিকল্পভাবে এনকটাইপকে "মাল্টিপার্ট / ফর্ম-ডেটা" সেট করুন (আমি ভাবছি আপনি পোষ্ট করতে চান কারণ আপনি ছবিগুলির মতো মাল্টিপার্ট ডেটা প্রেরণ করতে চান ?)

  3. প্রস্তুত হয়ে গেলে ফর্মটি পোস্ট করুন () পোস্ট করুন।

  4. আপনি যদি জাভাস্ক্রিপ্ট ফেরত দিতে অন্য ডোমেনটি পেতে পারেন যা ইফ্রেমেসের সাথে ক্রস-ডোমেন যোগাযোগ করবে ( http://softwareas.com/cross-domain-communication-with-iframes ) তবে আপনি ভাগ্যবান এবং আপনি প্রতিক্রিয়াটি ক্যাপচার করতে পারেন যেমন.

অবশ্যই, আপনি যদি নিজের সার্ভারকে প্রক্সি হিসাবে ব্যবহার করতে চান তবে আপনি এগুলি এড়াতে পারেন। কেবল আপনার নিজের সার্ভারে ফর্মটি জমা দিন, যা অন্য সার্ভারের কাছে অনুরোধের প্রক্সি করবে (ধরে নিলে অন্য সার্ভার আইপি তাত্পর্য লক্ষ্য করার জন্য সেট আপ করা হয়নি), প্রতিক্রিয়া পাবেন এবং যা যা চান তা ফিরিয়ে দিন।


6

আরও একটি গুরুত্বপূর্ণ বিষয় লক্ষ্য করুন !!! ইন উদাহরণস্বরূপ এটি কিভাবে ব্যবহার করতে বর্ণিত আছে তা উপরে

$.ajax({
    type     : 'POST',
    dataType : 'json', 
    url      : 'another-remote-server',
    ...
});

JQuery 1.6 এবং নিম্নের ক্রস-ডোমেন এক্সএইচআর সহ একটি বাগ রয়েছে। ফায়ারব্যাগের মতে অপশন ছাড়া অন্য কোনও অনুরোধ প্রেরণ করা হয়নি। কোনও পোস্ট নেই। মোটেই

আমার কোডটি টেস্টিং / টিউন করার জন্য 5 ঘন্টা ব্যয় করেছে। রিমোট সার্ভারে (স্ক্রিপ্ট) প্রচুর শিরোনাম যুক্ত করা হচ্ছে। কোন প্রভাব ছাড়াই। তবে পরে, আমি জিকুয়ারি লাইবকে 1.6.4 এ আপডেট করেছি এবং সমস্ত কিছুই কবজির মতো কাজ করে।


হুপস, অপেরা 10.61 এ নেই। এটি করার আমার চূড়ান্ত সিদ্ধান্তটি ছিল আমার ডোমেনে পিএইচপি প্রক্সি ব্যবহার করা।
বাসটেলার

আপনি কীভাবে পিএইচপি প্রক্সি ব্যবহার করেছেন? আপনি কি আমাকে গাইড করতে পারেন?
Zoran777

নীচের উত্তরগুলি দেখুন, যেমন ইভান
ডার্স্ট

5

আপনি jQuery AJAX সঙ্গে ASP.net MVC পরিবেশে এই কাজ করতে চান তাহলে এই পদক্ষেপগুলি অনুসরণ করুন: (এই এ দেওয়া সমাধানের একটি সারাংশ এই থ্রেডে )

ধরে নিন যে "কলার ডট কম" (যে কোনও ওয়েবসাইট হতে পারে) "সার্ভার ডট কম" এ পোস্ট করতে হবে (একটি এএসপি নেটওয়ার এমভিসি অ্যাপ্লিকেশন)

  1. "সার্ভার ডটকম" অ্যাপের ওয়েবকনফিগটিতে নিম্নলিখিত বিভাগটি যুক্ত করুন:

      <httpProtocol>
          <customHeaders>
              <add name="Access-Control-Allow-Origin" value="*" />
              <add name="Access-Control-Allow-Headers" value="Content-Type" />
              <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS" />
          </customHeaders>
      </httpProtocol>
  2. "সার্ভার ডট কম" এ, আমরা নিয়ামকের উপরে নিম্নলিখিত ক্রিয়াটি করব ("হোম" নামে পরিচিত) যেখানে আমরা পোস্ট করব:

    [HttpPost]
    public JsonResult Save()
    {
        //Handle the post data...
    
        return Json(
            new
            {
                IsSuccess = true
            });
    }
  3. তারপরে "কলার ডটকম" থেকে কোনও ফর্ম (এইচটিএমএল আইডি "ফর্মআইডি" সহ) "সার্ভার ডটকম" সহ নিম্নলিখিত তথ্য পোস্ট করুন:

    $.ajax({
            type: "POST",
            url: "http://www.server.com/home/save",
            dataType: 'json',
            crossDomain: true,
            data: $(formId).serialize(),
            success: function (jsonResult) {
               //do what ever with the reply
            },
            error: function (jqXHR, textStatus) {
                //handle error
            }
        });

4

আরও একটি উপায় আছে (এইচটিএমএল 5 বৈশিষ্ট্য ব্যবহার করে)। আপনি অন্য ডোমেনে হোস্ট করা প্রক্সি ইফ্রেম ব্যবহার করতে পারেন, আপনি সেই আইফ্রেমে পোস্টম্যাসেজ ব্যবহার করে বার্তা প্রেরণ করেন, তারপরে যদি আইফ্রেমে পোষ্ট উইন্ডোতে পোষ্ট অনুরোধ (একই ডোমেনে) এবং পোস্টমেসেজ ফিরে করতে পারে।

প্রেরক.কম এ পিতামাতা

var win = $('iframe')[0].contentWindow

function get(event) {
    if (event.origin === "http://reciver.com") {
        // event.data is response from POST
    }
}

if (window.addEventListener){
    addEventListener("message", get, false)
} else {
    attachEvent("onmessage", get)
}
win.postMessage(JSON.stringify({url: "URL", data: {}}),"http://reciver.com");

iframe on reciver.com

function listener(event) {
    if (event.origin === "http://sender.com") {
        var data = JSON.parse(event.data);
        $.post(data.url, data.data, function(reponse) {
            window.parent.postMessage(reponse, "*");
        });
    }
}
// don't know if we can use jQuery here
if (window.addEventListener){
    addEventListener("message", listener, false)
} else {
    attachEvent("onmessage", listener)
}

স্ট্যাকওভারফ্লো / প্রশ্ন / 38940932/… সম্পর্কিত প্রশ্ন রয়েছে । আপনার নমুনার উপর ভিত্তি করে কিছু প্লাগইন বা জেনেরিক ফাংশন তৈরি করা সম্ভব?
অ্যান্ড্রুস

@ এন্ড্রস সম্ভবত এরকম কিছু হতে পারে gist.github.com/jcubic/26f806800abae0db9a0dfccd88cf6f3c
jcubic

এই কোডটির জন্য রিসিভার পৃষ্ঠাটি পরিবর্তন করা দরকার। রিসিভার পৃষ্ঠাগুলি সংশোধন করতে না পারলে প্রতিক্রিয়া কীভাবে পড়বেন?
অ্যান্ড্রুস

@ অ্যান্ড্রুস আপনার সেখানে অ্যাসেক্স অনুরোধগুলি প্রেরণের জন্য রিসিভার ডটকমের আইফ্রেমে অ্যাক্সেসের দরকার নেই। Iframe ছাড়া কোন অনুরোধ থাকবে না।
jcubic

3

উচ্চ স্তর .... আপনার সার্ভারে আপনার একটি নাম সেটআপ করা দরকার যাতে অন্যান্য- সংরক্ষণ.your-server.com অন্যান্য-সার্ভার ডট কমকে নির্দেশ করে।

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

সম্ভাব্য তবে আপনার-server.com এবং অন্যান্য-সার্ভার ডট কম থেকে সমন্বয় প্রয়োজন


পুনর্নির্দেশের জন্য কোনও সিএনএম ব্যবহার করার কথা ভাবেনি। ভাল কল! আমি এখনও এটি চেষ্টা করেছি কিন্তু আমি ধরে নিচ্ছি যে সিআইএম ব্রাউজারটিকে একই সাইটের সাথে ইন্টারেক্ট করছে তা ভেবে চালিত করবে? আমি এটি অ্যামাজন এস 3 এ পোস্ট করতে ব্যবহার করব তাই আমি এই কাজগুলি আশা করছি।
স্পেনসারিলিওট

1
আমি দেখতে পাচ্ছি না কীভাবে এটি কোনও সমস্যার সমাধান করবে। ভিন্ন সাবডোমেনে পারাপারের একই সমস্যা যেমন কোনও অন্য ডোমেনে পারাপার হয়।
অক্টোপাস


2

এটি একটি পুরানো প্রশ্ন, তবে কিছু নতুন প্রযুক্তি কারওর সাহায্য করতে পারে।

আপনার যদি অন্য সার্ভারে প্রশাসনিক অ্যাক্সেস থাকে তবে আপনি ক্রস-ডোমেন পোস্টটি সম্পন্ন করতে ওপেনসোর্স ফোর্জ প্রকল্পটি ব্যবহার করতে পারেন। ফোর্স একটি ক্রস-ডোমেন জাভাস্ক্রিপ্ট এক্সএমএলএইচটিটিপিআরকেস্ট মোড়ক সরবরাহ করে যা ফ্ল্যাশের কাঁচা সকেট এপিআইয়ের সুবিধা নেয়। পোষ্ট এমনকি টিএলএসের মাধ্যমেও করা যেতে পারে।

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

http://github.com/digitalbazaar/forge


2

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি আমার পদ্ধতির ভাগ করতে চেয়েছিলাম। আমি প্রক্সি হিসাবে খুব সহজ এবং ধারাবাহিক হিসাবে সিআরএল ব্যবহার করি। সাবমিট.এফপি নামে একটি পিএইচপি পৃষ্ঠা তৈরি করুন এবং নিম্নলিখিত কোডটি যুক্ত করুন:

<?

function post($url, $data) {
$header = array("User-Agent: " . $_SERVER["HTTP_USER_AGENT"], "Content-Type: application/x-www-form-urlencoded");
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}

$url = "your cross domain request here";
$data = $_SERVER["QUERY_STRING"];
echo(post($url, $data));

তারপরে, আপনার জেএসে (এখানে jQuery):

$.ajax({
type: 'POST',
url: 'submit.php',
crossDomain: true,
data: '{"some":"json"}',
dataType: 'json',
success: function(responseData, textStatus, jqXHR) {
    var value = responseData.someKey;
},
error: function (responseData, textStatus, errorThrown) {
    alert('POST failed.');
}
});

1

ওয়াইকিউএল কাস্টম টেবিল + জেএস এক্সএইচআর দিয়ে সম্ভব হওয়া উচিত, একবার দেখুন: http://developer.yahoo.com/yql/guide/index.html

আমি এটি কিছু ক্লায়েন্ট সাইড (জেএস) এইচটিএমএল স্ক্র্যাপিং করতে ব্যবহার করি, ভাল কাজ করে (ইন্টারনেট / প্লেলিস্ট / লিরিক্স / লাস্ট এফএম তথ্য, সমস্ত ক্লায়েন্ট জেএস + ওয়াইকিউএলএ অনুসন্ধান সহ আমার একটি সম্পূর্ণ অডিও প্লেয়ার রয়েছে)


1

কর্স আপনার জন্য। কর্স হ'ল "ক্রস অরিজিন রিসোর্স শেয়ারিং", ক্রস ডোমেন অনুরোধ প্রেরণের একটি উপায় the এখন এক্সএমএলএইচটিপিআরকোস্ট 2 এবং ফেচ এপিআই উভয়ই কর্সকে সমর্থন করে এবং এটি পোষ্ট এবং অনুরোধ উভয়ই প্রেরণ করতে পারে

তবে এর সীমাবদ্ধতা রয়েছে er সার্ভারের অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্স নির্দিষ্ট দাবি করা দরকার এবং এটি '*' তে সেট করা যায় না।

এবং যদি আপনি চান যে কোনও উত্স আপনার কাছে অনুরোধ প্রেরণ করতে পারে, আপনার জেএসএনপি দরকার ( অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি- উত্সও সেট করতে হবে তবে '*' হতে পারে)

প্রচুর অনুরোধের উপায়ের জন্য যদি আপনি কীভাবে পছন্দ করবেন তা জানেন না, আমি মনে করি এটি করার জন্য আপনার একটি সম্পূর্ণ কার্যকরী উপাদান দরকার me আমাকে একটি সাধারণ উপাদানটি উপস্থাপন করুন https://github.com/Joker- জেলি / কেট্টা


আপনি যদি আধুনিক ব্রাউজারটি ব্যবহার করছেন (> আইই 9, ক্রোম, এফএফ, এজ, ইত্যাদি), খুব সাধারণ একটি সৌন্দর্য উপাদান আপনাকে https://github.com/ জোকার- জেলি / কেট্টা ব্যবহার করার পরামর্শ দিচ্ছেন .এর কোনও নির্ভরতা নেই, কম 3KB এর চেয়েও বেশি, এবং এটি একই মারাত্মক নমুনা বাক্য গঠন এবং বিকল্পগুলির সাথে ফ্যাচ, এজেএক্স এবং জেএসএনপি সমর্থন করে।

catta('./data/simple.json').then(function (res) {
  console.log(res);
});

এটি ES6 মডিউল, কমনজেএস এবং এমনকি <script>এইচটিএমএল এর মতো আপনার প্রকল্পেও আমদানির সমস্ত উপায়ে সমর্থন করে ।


1

আপনার যদি ক্রস ডোমেন সার্ভারে অ্যাক্সেস থাকে এবং সার্ভারের দিক থেকে কোনও কোড পরিবর্তন করতে না চান তবে আপনি - 'xdomain' নামে একটি লাইব্রেরি ব্যবহার করতে পারেন।

কিভাবে এটা কাজ করে:

পদক্ষেপ 1: সার্ভার 1: এক্সডোমেন লাইব্রেরি অন্তর্ভুক্ত করুন এবং ক্রস ডোমেনকে ক্রীতদাস হিসাবে কনফিগার করুন:

<script src="js/xdomain.min.js" slave="https://crossdomain_server/proxy.html"></script>

পদক্ষেপ 2: ক্রস ডোমেন সার্ভারে, একটি প্রক্সি html ফাইল তৈরি করুন এবং সার্ভার 1 কে মাস্টার হিসাবে অন্তর্ভুক্ত করুন:

proxy.html:
<!DOCTYPE HTML>
<script src="js/xdomain.min.js"></script>
<script>
  xdomain.masters({
    "https://server1" : '*'
  });
</script>

ধাপ 3:

এখন, আপনি সার্ভার 1 থেকে শেষ পয়েন্ট হিসাবে প্রক্সি.এইচটিএমএলে একটি এজেএক্স কল করতে পারেন। এটি সিওআরএস অনুরোধটিকে বাইপাস করুন। গ্রন্থাগারটি অভ্যন্তরীণভাবে iframe সমাধান ব্যবহার করে যা শংসাপত্র এবং সমস্ত সম্ভাব্য পদ্ধতির সাথে কাজ করে: জিইটি, পোষ্ট ইত্যাদি with

এজ্যাক্স কোড জিজ্ঞাসা করুন:

$.ajax({
        url: 'https://crossdomain_server/proxy.html',
        type: "POST",
        data: JSON.stringify(_data),
        dataType: "json",
        contentType: "application/json; charset=utf-8"
    })
    .done(_success)
    .fail(_failed)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.