لماذا أحصل على خيارات خيارات بدلا من طلب الحصول على طلب؟

StackOverflow https://stackoverflow.com/questions/1256593

سؤال

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js" type="text/javascript"></script>
<script>
$.get("http://example.com/", function(data) {
     alert(data);
});
</script>

يقوم بطلب خيارات لهذا عنوان URL، ثم لا يسمى رد الاتصال بأي شيء.

عندما لا يكون عبر المجال، فإنه يعمل بشكل جيد.

لا ينبغي أن jQuery فقط دعوة مع <script> العقدة ثم رد الاتصال عند تحميلها؟ أنا أفهم أنني لن أتمكن من الحصول على النتيجة (نظرا لأن المجال عبر المجال)، ولكن هذا جيد؛ أريد فقط أن تذهب المكالمة. هل هذا خطأ، أو أفعل شيئا خطأ؟

هل كانت مفيدة؟

المحلول 2

الخيارات من http://www.w3.org/tr/cors/ يرى http://metajack.im 2010/01/19/crossdomain-ajax-for-xmpp-http-binding-made-asy/ للحصول على معلومات أكثر قليلا

نصائح أخرى

وفق MDN.,

طلبات المبدئية

على عكس الطلبات البسيطة (تمت مناقشتها أعلاه)، تقوم طلبات "المبدئية" أولا بإرسال رأس طلب خيارات HTTP إلى المورد على المجال الآخر، من أجل تحديد ما إذا كان الطلب الفعلي آمن لإرساله. يتم إنشاء طلبات العرض المتبادلة مثل هذا لأنها قد يكون لها آثار على بيانات المستخدم. على وجه الخصوص، يتم إنشاء طلب إذا:

  • يستخدم أساليب أخرى غير الحصول على أو النشر. أيضا، إذا تم استخدام المشاركة لإرسال بيانات طلب مع نوع المحتوى بخلاف تطبيق / X-WWW-FORM-FORM-RUNCORDED أو بيانات متعددة النماذج / النموذج أو النص / عادي، على سبيل المثال إذا كان طلب المشاركة يرسل حمولة XML إلى الخادم باستخدام التطبيق / XML أو النص / XML، ثم يتم إنشاء الطلب.
  • إنه يحدد رؤوس مخصصة في الطلب (على سبيل المثال، يستخدم الطلب رأسا مثل X-Pingother)

إذا كنت تحاول بريد

تاكد من JSON.stringify بيانات النموذج الخاص بك وإرسال كما text/plain.

<form id="my-form" onSubmit="return postMyFormData();">
    <input type="text" name="name" placeholder="Your Name" required>
    <input type="email" name="email" placeholder="Your Email" required>
    <input type="submit" value="Submit My Form">
</form>

function postMyFormData() {

    var formData = $('#my-form').serializeArray();
    formData = formData.reduce(function(obj, item) {
        obj[item.name] = item.value;
        return obj;
    }, {});
    formData = JSON.stringify(formData);

    $.ajax({
        type: "POST",
        url: "https://website.com/path",
        data: formData,
        success: function() { ... },
        dataType: "text",
        contentType : "text/plain"
    });
}

لا أعتقد أن مسج سيؤدي بطبيعة الحال إلى طلب JSONP عند إعطاء عنوان URL من هذا القبيل. ومع ذلك، فستفعل طلب JSONP عند إخباره بما هو حجة لاستخدامه لإعداء اتصال:

$.get("http://metaward.com/import/http://metaward.com/u/ptarjan?jsoncallback=?", function(data) {
     alert(data);
});

الأمر متروك بالكامل إلى البرنامج النصي الاستقبال للاستفادة من هذه الحجة (التي لا يجب أن تسمى "jsoncallback")، لذلك في هذه الحالة لن يتم استدعاء الوظيفة أبدا. لكن منذ أن ذكرت أنك تريد فقط تنفيذ البرنامج النصي في Metaward.com، من شأنه أن يجعله.

في الواقع، لا يسمح بطلبات AJAX (XMLHTTP) عبر المجال (XMLHTTP) بسبب الأسباب الأمنية (فكر في جلب صفحة الويب "المقيدة" من جانب العميل وإرسالها مرة أخرى إلى الخادم - ستكون هذه مشكلة أمان).

الحل الوحيد هو هناك احتياطيات. هذا هو: إنشاء كائن نصي جديد وإشارة إلى SRC إلى JavaScript الجانب الإنذاقي، وهو اتصال مع قيم JSON (MyFunction ({data})، myfunction هو وظيفة تفعل شيئا مع البيانات (على سبيل المثال، تخزينه في متغير).

ما عليك سوى تغيير "التطبيق / JSON" إلى "النص / العادي" ولا تنسى json.streseify (طلب):

var request = {Company: sapws.dbName, UserName: username, Password: userpass};
    console.log(request);
    $.ajax({
        type: "POST",
        url: this.wsUrl + "/Login",
        contentType: "text/plain",
        data: JSON.stringify(request),

        crossDomain: true,
    });

كان لي نفس المشكلة. كان إصلاحي لإضافة رؤوس إلى البرنامج النصي PHP الخاص بي الموجود فقط عند في بيئة DEV.

هذا يسمح بطلبات المجال عبر:

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

هذا يخبر طلب الاختبار المبدئي أنه على ما يرام للعميل إرسال أي رؤوس يريد:

header("Access-Control-Allow-Headers: *");

بهذه الطريقة ليست هناك حاجة لتعديل الطلب.

إذا كانت لديك بيانات حساسة في قاعدة بيانات Dev الخاصة بك قد تكون قد تسربت، فقد تفكر مرتين حول هذا الموضوع.

يبدو الأمر وكأنه فايرفوكس والأوبرا (تم اختباره على ماك أيضا) لا يحبون النما عبر هذا (ولكن رحلات السفاري على ما يرام معها).

قد تضطر إلى استدعاء رمز جانب خادم محلي لإعاقة الصفحة عن بعد.

في حالتي، كانت القضية غير مرتبطة ل Cors منذ إصدار وظيفة مسج لنفس خادم الويب. كانت البيانات JSON لكني حذفت Datatype: 'JSON' المعلمة.

لم يكن لدي (كما أنني أضفت) معلمة ContentType كما هو موضح في إجابة David Lopes "أعلاه.

كنت قادرا على إصلاحه بمساعدة رؤوس التالية

Access-Control-Allow-Origin
Access-Control-Allow-Headers
Access-Control-Allow-Credentials
Access-Control-Allow-Methods

إذا كنت على Nodejs، فإليك التعليمات البرمجية التي يمكنك نسخها / لصقها.

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin','*');
  res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH');
  next();
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top