ক্রোমে AJAX GET / POST / PUT / DELETE এর পরিবর্তে অপশন পাঠাচ্ছে?


107

আমি কর্মক্ষেত্রে একটি অভ্যন্তরীণ ওয়েব অ্যাপ্লিকেশন নিয়ে কাজ করছি। আইই 10 তে অনুরোধগুলি ঠিকঠাক কাজ করে, তবে ক্রোমে সমস্ত অ্যাজাক্স অনুরোধগুলি (যা অনেকগুলি রয়েছে) আমি যে কোনও সংজ্ঞায়িত পদ্ধতির পরিবর্তে অপশন ব্যবহার করে প্রেরণ করা হয়। প্রযুক্তিগতভাবে আমার অনুরোধগুলি "ক্রস ডোমেন"। সাইটটি লোকালহোস্টে দেওয়া হয়েছে: 6120 এবং আমি যে এজাহারটির জন্য অনুরোধ করছি সে পরিষেবাটি 57124- এ রয়েছে This এই বন্ধ জ্যাকারি বাগটি বিষয়টি সংজ্ঞায়িত করেছে, তবে সত্যিকারের সমাধান নয়।

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

সম্পাদনা:

এটি প্রতিটি পৃষ্ঠার ডকুমেন্ট লোডে রয়েছে:

jQuery.support.cors = true;

এবং প্রতিটি এজেএক্স একইভাবে নির্মিত:

var url = 'http://localhost:57124/My/Rest/Call';
$.ajax({
    url: url,
    dataType: "json",
    data: json,
    async: true,
    cache: false,
    timeout: 30000,
    headers: { "x-li-format": "json", "X-UserName": userName },
    success: function (data) {
        // my success stuff
    },
    error: function (request, status, error) {
        // my error stuff
    },
    type: "POST"
});

2
এই বাগের প্রতিবেদনের শেষ মন্তব্যটি এটি বেশ ভালভাবে ব্যাখ্যা করেছে ...
কেভিন বি

1
এটি আমার মনকে উল্টে গেল কারণ আমি যা কিছু করি তা ভ্যানিলা (এবং আমার কোডটি জ্যাকুরি বাগের সাথে সাদৃশ্যপূর্ণ)। একপাশে, এটি অন্তর্ভুক্ত না করার কোনও অজুহাত নয়। বিআরবি, কিছু নমুনা কোড দখল করছে।
কোরি ওগবার্ন

3
নোট করুন যে কোনও অনুরোধ ক্রস-অরিজিন কিনা তা নির্ধারণের সময় IE পোর্ট নম্বর বিবেচনা করে না।
রে নিকোলাস

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

এটি এই সত্যটি পরিবর্তন করে না যে আপনি যদি ক্রস-আর্জি অনুরোধ করতে চান তবে আপনাকে সঠিকভাবে কাজ করার জন্য ক্রস-অরিজিন অনুরোধগুলির জন্য প্রযোজ্য সমস্ত বিধি অনুসরণ করতে হবে। ক্রস-অরিজিন অনুরোধগুলিতে সাধারণত একটি বিকল্পগুলির অনুরোধ জড়িত। এটি সঠিকভাবে পরিচালনা করুন এবং সমস্যাটি চলে যাবে। এটি সমাধানের একমাত্র অন্য উপায় (এপিআই পরিবর্তন না করে) হ'ল প্রাথমিক পৃষ্ঠা হিসাবে একই সার্ভারে একটি স্ক্রিপ্ট থাকা যা সার্ভার-সাইড কোড ব্যবহার করে এপিআইয়ের সাথে যোগাযোগ করে।
কেভিন বি

উত্তর:


136

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

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

  • এটি জিইটি, হেড বা পোষ্ট ব্যতীত অন্য পদ্ধতি ব্যবহার করে। এছাড়াও, যদি POST অ্যাপ্লিকেশন / x-www-form-urlencoded, মাল্টিপার্ট / ফর্ম-ডেটা, বা পাঠ্য / প্লেইন ব্যতীত কোনও সামগ্রী-প্রকারের সাথে অনুরোধ ডেটা প্রেরণ করতে ব্যবহৃত হয়, যেমন যদি POST অনুরোধটি সার্ভারে একটি এক্সএমএল পেলোড প্রেরণ করে অ্যাপ্লিকেশন / এক্সএমএল বা পাঠ্য / এক্সএমএল ব্যবহার করে, তারপরে অনুরোধটি পূর্বনির্ধারিত।
  • এটি অনুরোধে কাস্টম শিরোলেখ সেট করে (উদাহরণস্বরূপ অনুরোধটি শিরোনাম যেমন এক্স-পিনোগোথার ব্যবহার করে)

20
কাস্টম শিরোনাম। এটি সম্ভবত প্রিফলাইট বিকল্পগুলি কল বন্ধ করে দিচ্ছে।
কোরি ওগবার্ন

18

অনুরোধটি ডিফল্ট পোর্ট 80/443 এ প্রেরণ করা হয়নি তার উপর ভিত্তি করে এই অ্যাজাক্স কলটি স্বয়ংক্রিয়ভাবে একটি ক্রস-অরিজিন রিসোর্স (সিওআরএস) অনুরোধ হিসাবে বিবেচিত হবে , যার অর্থ অন্য কথায় অনুরোধটি হল যে অনুরোধটি স্বয়ংক্রিয়ভাবে একটি অপশন অনুরোধ জারি করে যা যাচাই করে সার্ভারের / সার্লেটের পাশে CORS শিরোনাম।

আপনি সেট করলেও এটি ঘটে

crossOrigin: false;

বা যদি আপনি এটি বাদ দেন।

কারণটি কেবল এটি localhost != localhost:57124। এটি কেবল localhostবন্দর ছাড়াই পাঠানোর চেষ্টা করুন - এটি ব্যর্থ হবে, কারণ অনুরোধ করা লক্ষ্যটি পৌঁছানো সম্ভব হবে না তবে খেয়াল করুন যে ডোমেনের নামগুলি সমান হলে অনুরোধটি পোস্টের আগে অপশন অনুরোধ ছাড়াই প্রেরণ করা হয়।


3

আমি কেভিন বি এর সাথে একমত, বাগ রিপোর্টটি সব বলেছে। মনে হচ্ছে আপনি ক্রস-ডোমেন আজাক্স কল করার চেষ্টা করছেন। আপনি যদি একই উত্স নীতিটির সাথে পরিচিত না হন তবে আপনি এখানে শুরু করতে পারেন: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Same_origin_policy_for_JavaScript

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


1
আমাদের সিস্টেমের কাঠামো এমন কিছু যা আমি পরিবর্তন করতে পারি না। একটি ভিন্ন বন্দর ব্যবহার করা আমাদের স্থাপত্যের প্রয়োজনীয়তা। আমি একই উত্স নীতি পেয়েছি কিন্তু ভেবেছিলাম যে আমরা প্রয়োগ করা CORS যথেষ্ট ছিল। দৃশ্যত না.
কোরি ওগবার্ন

2
যদি আপনার সার্ভারটি JSON প্রতিক্রিয়াগুলি দেয়, আপনি JSONP পদ্ধতিটি সন্ধান করতে পারেন, কেবল এটি দায়বদ্ধতার সাথে ব্যবহার করুন।
jgitter

1
আমি আপনার সাথে তর্ক করার পক্ষে সত্যই পাত্তা দিচ্ছি না, তবে জেএসওএনপি অন্য ডোমেন থেকে ডেটা টানতে স্ক্রিপ্ট ট্যাগ ব্যবহার করে এবং ফলাফলটি কলব্যাক ফাংশনে প্রেরণ করে। ফলাফলটি জসন না হলে এটি অনেক বেশি শক্ত।
jgitter

1
না, এটি খুব বেশি শক্ত নয়। আসলে প্রতিক্রিয়া কোনও ক্ষেত্রেই বৈধ JSON হওয়া উচিত নয়। পরিবর্তে, সার্ভার ভালো কিছু আসতে হবে: callbackfunc(somedata)। আপনি দেখতে পাচ্ছেন, এটি বৈধ JSON নয়। এবং, somedataএকটি স্ট্রিং, বা একটি সংখ্যা হতে পারে বা আপনি এটি যা চান তা হতে পারে।
রায় নিকোলাস

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

1

যদি সম্ভব হয় তবে নিয়মিত জিইটি / পোষ্টের মাধ্যমে আলাদা নামের সাথে প্যারামগুলি পাস করুন এবং আপনার সার্ভারের সাইড কোডটি এটি পরিচালনা করতে দিন।

সিওআরএসকে বাইপাস করার জন্য আমার নিজস্ব প্রক্সি নিয়ে আমার একই রকম সমস্যা ছিল এবং আমি ক্রোমে POST-> অপশন এর একই ত্রুটি পেয়েছি। মনে হচ্ছিল Authorization(আমার ক্ষেত্রে হেডার "x-li-format"এবং "X-UserName"আপনার ক্ষেত্রে এখানে।) আমি (যেমন একটি ডামি বিন্যাসে ক্ষণস্থায়ী শেষ পর্যন্ত AuthorizatinJackপেতে) এবং আমার প্রক্সি ঘুরে যে একটি শিরোলেখ মধ্যে যখন গন্তব্যে কল করার আমি কোডটি পরিবর্তন । এখানে এটি পিএইচপিতে রয়েছে:

if (isset($_GET['AuthorizationJack'])) {
    $request_headers[] = "Authorization: Basic ".$_GET['AuthorizationJack'];
}

1

আমার ক্ষেত্রে আমি AWS (API গেটওয়ে) দ্বারা হোস্ট করা একটি API কল করছি API ত্রুটিটি ঘটেছে যখন আমি API এর নিজস্ব ডোমেন ব্যতীত অন্য কোনও ডোমেন থেকে API কল করার চেষ্টা করেছি। যেহেতু আমি এপিআই মালিক আছি বর্ণনা অনুযায়ী পরীক্ষা পরিবেশের জন্য CORS সক্ষম করা থাকে, আমাজন ডকুমেন্টেশন

উত্পাদনে এই ত্রুটিটি ঘটবে না, যেহেতু অনুরোধ এবং এপিআই একই ডোমেনে থাকবে।

আমি আসা করি এটা সাহায্য করবে!


0

@ ডার্ক ফ্যালকন দ্বারা উত্তর হিসাবে , আমি কেবল এটি মোকাবেলা করেছি

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

সুতরাং আমার অ্যাপ্লিকেশন রুটিনে সেশন-যদি-না-উপস্থিত থাকে, আমি পদ্ধতিটি কিনা তা দেখার জন্য কেবল একটি চেক যুক্ত করেছি OPTIONSএবং যদি তাই হয় তবে অংশ তৈরির অংশটি এড়িয়ে চলেছি:

    app.use(function(req, res, next) {
        if (req.method !== "OPTIONS") {
            if (req.session && req.session.id) {
                 // Session exists
                 next();
            }else{
                 // Create session
                 next();
          }
        } else {
           // If request method is OPTIONS, just skip this part and move to the next method.
           next(); 
        }
    }

0

প্রকৃত অনুরোধটি প্রেরণ করা নিরাপদ কিনা তা নির্ধারণ করতে "অপরিচ্ছন্ন" অনুরোধগুলি প্রথমে অপশনটি পদ্ধতিতে একটি HTTP অনুরোধটি অন্য ডোমেনের সংস্থানগুলিতে প্রেরণ করে। ক্রস-সাইট অনুরোধ

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS


1
আপনি কি আরও কিছু তথ্য যোগ করতে পারেন? আপনার উত্তর মতামত মত মনে হচ্ছে। :)
বাদচাডাবরা

0

অ্যাক্সেস ব্যবহার বিবেচনা করুন

axios.get( url,
{ headers: {"Content-Type": "application/json"} } ).then( res => {

  if(res.data.error) {

  } else { 
    doAnything( res.data )
  }

}).catch(function (error) {
   doAnythingError(error)
});

আনতে এবং অডিওগুলি পুরোপুরিভাবে কাজ করে আমার এই সমস্যাটি ছিল ।



0

আমি খুব অনুরূপ একটি সমস্যার মুখোমুখি হয়েছি। ফায়ারফক্সে কেন সঠিকভাবে কাজ করে এবং ক্রোমে ব্যর্থ হয় তা বুঝতে আমি প্রায় অর্ধ দিন কাটিয়েছি। আমার ক্ষেত্রে এটি আমার অনুরোধ শিরোনামে সদৃশ (বা সম্ভবত ভুল টাইপ করা) ক্ষেত্রগুলির কারণে হয়েছিল।


0

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


-1
 $.ajax({
            url: '###',
            contentType: 'text/plain; charset=utf-8',
            async: false,
            xhrFields: {
                withCredentials: true,
                crossDomain: true,
                Authorization: "Bearer ...."
            },

            method: 'POST',

            data: JSON.stringify( request ),
            success: function (data) {
                console.log(data);
            }
        });

বিষয়বস্তু টাইপ: 'পাঠ্য / প্লেইন; চরসেট = utf-8 ', বা কেবল কন্টেন্টটাইপ:' পাঠ্য / প্লেইন ', আমার পক্ষে কাজ করে! শুভেচ্ছা !!


এই প্রশ্নের সাথে আদৌ কী করার আছে?
কোরি ওগবার্ন

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

পদ্ধতিটির সাথে কন্টেন্টটাইপের কোনও সম্পর্ক নেই।
কোরি ওগবার্ন

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