XML DOM - مكون XMLHttpRequest
- الصفحة السابقة DOM Text
- الصفحة التالية DOM XMLSerializer
مثل XMLHttpRequest
يقدم مكون XMLHttpRequest الوصول الكامل إلى بروتوكول HTTP، بما في ذلك القدرة على إجراء طلبات POST وHEAD وطلبات GET العادية. يمكن لمكون XMLHttpRequest أن يرجع إجابات خادم الويب بشكل متزامن أو غير متزامن، ويمكنه إرجاع المحتوى بشكل نص أو مستند DOM.
على الرغم من أن الاسم هو XMLHttpRequest، فإنه ليس محصورًا في استخدامه مع مستندات XML: يمكنه استقبال أي شكل من مستندات النصوص.
مكون XMLHttpRequest هو اسم AJAX واحدة من الميزات الرئيسية لهيكل تطبيقات الويب.
دعم المتصفح
حصل XMLHttpRequest على دعم جيد من جميع المتصفحات الحديثة. يعتمد التطبيق الوحيد على إنشاء مكون XMLHttpRequest. في IE 5 و IE 6، يجب استخدام بناء ActiveXObject() المحدد لمتصفح IE. كما هو معروف، مثل XMLHttpRequest ما تم تقديمه في هذا الفصل.
W3C Standardization
لم يتم تحديد XMLHttpRequest object بعد، ولكن بدأت W3C في العمل على تحديده، ويتم تقديم محتوى هذا التعليمات على أساس مشروع الدraft التقييمي.
يتميز التطبيق الحالي لـ XMLHttpRequest بدرجة كبيرة من التوافق، ولكن هناك اختلافات طفيفة مع المعيار. على سبيل المثال، قد يعود تطبيق ما بـ null، بينما يطلب المعيار سلسلة فارغة، أو قد يتم تعيين state readyState إلى 3 دون ضمان أن تكون جميع الرؤوس الاستجابة متاحة.
خاصية
readyState
حالة الطلب HTTP. عند إنشاء XMLHttpRequest object لأول مرة، تبدأ قيمة هذا الخاصية من 0، حتى يتم استقبال استجابة HTTP كاملة، يتم زيادة هذه القيمة إلى 4.
لدي كل حالة من الـ 5 حالات حالة مرتبطة بإسم غير رسمي، يوضح الجدول أدناه الحالة والإسم والمفهوم:
الحالة | الاسم | الوصف |
---|---|---|
0 | Uninitialized | حالة التمهيد. تم إنشاء XMLHttpRequest object أو تم إعادة تعيينه بواسطة method abort(). |
1 | Open | تم استدعاء method open(). لم يتم استدعاء method send(). لم يتم إرسال الطلب بعد. |
2 | Sent | تم استدعاء method Send(). تم إرسال الطلب HTTP إلى الخادم. لم يتم استقبال أي استجابة. |
3 | Receiving | تم استقبال جميع رؤوس الاستجابة. بدأت استقبال جسم الاستجابة ولكن لم يكتمل. |
4 | Loaded | تم استقبال استجابة HTTP بالكامل. |
قيمة الـ readyState لا تنخفض إلا إذا تم استدعاء method abort() أو method open() أثناء عملية معالجة الطلب. في كل مرة يتم فيها زيادة قيمة هذا الخاصية، يتم إطلاق الحدث handler onreadystatechange.
responseText
جسم الاستجابة الذي تم استقباله حتى الآن من الخادم (باستثناء الرأس)، أو إذا لم يتم استقبال أي بيانات بعد، يكون السلسلة الفارغة.
إذا كان حالة الـ readyState أقل من 3، يكون هذا الخاصية سلسلة فارغة. عند حالة الـ readyState 3، يعود هذا الخاصية الجزء الذي تم استقباله حتى الآن من الاستجابة. إذا كان حالة الـ readyState 4، يتم حفظ الجسم الكامل للإستجابة في هذا الخاصية.
إذا كان الاستجابة تحتوي على رأس معتمد للرمزية الخاصة بالجسم الاستجابة، يتم استخدام هذه الرمزية. وإلا، يتم افتراض استخدام Unicode UTF-8.
responseXML
استجابة الطلب، يتم تحليلها إلى XML وتستخدم كـ مفهوم الوثيقةإرجاع.
status
من الخادم رمز حالة HTTP، مثل 200 يعني النجاح، و404 يعني خطأ "Not Found". عند قراءة هذه الخاصية عندما يكون حالة readyState أقل من 3، يُسبب استثنائية.
statusText
هذه الخاصية تستخدم الاسم بدلاً من الرقم لتعريف رمز حالة الطلب HTTP. على سبيل المثال، عندما يكون الحالة 200، يكون "OK"، وعندما يكون الحالة 404، يكون "Not Found". مثل خاصية status، فإن محاولة قراءة هذه الخاصية عندما يكون حالة readyState أقل من 3 تؤدي إلى استثنائية.
دالة معالجة الحدث
onreadystatechange
دالة معالجة الحدث تُدعى عند تغيير حالة property readyState. قد يتم استدعاء هذه الدالة أيضًا عدة مرات عندما يكون حالة readyState 3.
الطريقة
abort()
إلغاء الرد الحالي، وإغلاق الاتصال وإنهاء أي نشاط شبكي معقد.
تسجيل هذا الدوال يعادة تعيين XMLHttpRequest إلى حالة readyState 0، وينهي جميع الأنشطة الشبكية المعقدة. على سبيل المثال، إذا استغرقت الطلبات وقتًا طويلاً، ولم تعد الردود ضرورية، يمكن استدعاء هذه الدالة.
getAllResponseHeaders()
إرجاع رؤوس الرد HTTP كنص غير معالج.
إذا كان حالة readyState أقل من 3، فإن هذه الدالة تعود null. وإلا، تعود جميع الرؤوس الرد HTTP التي يرسلها الخادم. يتم إرجاع الرؤوس كنص واحد، رأسًا في كل سطر. يتم فصل كل سطر بفاصلة معبرة "\r\n".
getResponseHeader()
إرجاع قيمة رأس الرد HTTP المحدد. المعلمات هي اسم رأس الرد HTTP المطلوب إرجاعه. يمكن استخدام أي حجم كتابة لتحديد اسم الرأس، ولا يتم التمييز بين الحروف الكبيرة والصغيرة عند مقارنة الاسم مع رأس الرد.
القيمة التي تعود بها هذه الدالة هي قيمة رأس الرد HTTP المحدد، وإذا لم يتم استقبال هذا الرأس أو إذا كان حالة readyState أقل من 3، فإنها تكون نصًا فارغًا. إذا تم استقبال عدة رؤوس تحتوي على اسم معين، يتم ربط القيم معًا وإرجاعها، باستخدام فاصلة وتباين لتقسيم قيم الرؤوس.
open()
تهيئة معلمات طلب HTTP مثل URL ومتدخل HTTP، ولكن لا يرسل الطلب.
send()
إرسال طلب HTTP باستخدام المعلمات المقدمة إلى دالة open() ومعلمات الطلب الاختيارية المقدمة إلى هذه الدالة.
setRequestHeader()
تسجيل طلب مفتوح غير منسق أو إضافة HTTP طلب.
XMLHttpRequest.open()
تعيين معاملات الطلب HTTP
النحو
open(method, url, async, username, password)
المعامل method هو الطريقة HTTP المستخدمة في الطلب. تشمل القيم GET، POST، و HEAD.
المعامل url هو جسم الطلب. تطبق معظم المتصفحات سياسة الأمان بنفس الموقع وتطلب أن يكون هذا URL نفس اسم النطاق ومرفق المنفذ الذي يحتوي على النص الذي يحتوي على السكربت.
يُشير المعامل async إلى تنفيذ الطلب بشكل غير متزامن. إذا كان هذا المعامل غير صحيح، يكون الطلب متزامناً، ويتم إيقاف تشغيل أي استدعاء لـ send() حتى يتم استقبال الاستجابة بشكل كامل. إذا كان هذا المعامل صحيحًا أو لم يتم تحديده، يكون الطلب غير متزامن، وغالبًا ما يتطلب معالجًا لحدث onreadystatechange.
المعاملات username و password اختياريتان وتقدم شهادة إثبات هوية للإذن المطلوب من url. إذا تم تحديدهما، فإنها تغطي أي شهادة إذن محددة مسبقًا في url.
شرح
تستخدم هذه الطريقة لتعيين معاملات الطلب للطريقة send() في وقت لاحق. وتضبط حالة الـ readyState إلى 1، وتزيل جميع الرؤوس الطلبية المحددة مسبقًا، وكذلك جميع الرؤوس الاستجابة المكتسبة مسبقًا، وتضبط المعاملات responseText، responseXML، status، و statusText إلى قيمهم الافتراضية. من الآمن استدعاء هذه الطريقة عندما يكون الـ readyState 0 (عند إنشاء XMLHttpRequest أو استدعاء طريقة abort()) أو عندما يكون الـ readyState 4 (عند استقبال الاستجابة). عند استدعاء هذه الطريقة في أي حالة أخرى، يكون سلوك طريقة open() محددًا.
إضافة إلى حفظ المعاملات للطريقة send()، وإعادة تعيين XMLHttpRequest إلى إعادة الاستخدام، لا يقدم طريقة open() سلوكاً آخر. يجب الانتباه إلى أن، عند استدعاء هذه الطريقة، عادة ما لا يفتح التنفيذ اتصالاً إلى خادم الويب.
XMLHttpRequest.send()
إرسال طلب HTTP
النحو
إرسال (الجسم)
إذا كان الطريقة المحددة باستدعاء open() هي POST أو PUT، فإن معامل الجسم يحدد الجسم الطلب كـ مفهوم الوثيقةإذا كان الطلب الجسم غير ضروري، فإن هذا المعامل يكون null. بالنسبة لجميع الطرق الأخرى، هذا المعامل غير متاح ويجب أن يكون null (لا يسمح بعض التنفيذات بتخطي هذا المعامل).
شرح
تؤدي هذه الطريقة إلى إرسال طلب HTTP. إذا لم يتم تفعيل دعوة open() من قبل، أو بشكل أكثر دقة، إذا لم يكن حالة الـ readyState 1، فإن طريقة send() ترفع استثناءً. وإلا، فإنها ترسل طلب HTTP يتكون من عدة أجزاء: }}
- طريقة HTTP، URL و الشهادات المحددة مسبقًا عند تفعيل دعوة open() (إذا كانت موجودة).
- رأس الطلب الذي تم تحديده مسبقًا عند تفعيل دعوة setRequestHeader() (إذا كان موجودًا).
- تم تحديده لهذه الطريقة الجسم المعاملات.
بمجرد إصدار الطلب، يضبط send() حالة الـ readyState على 2 ويقوم بتنشيط معالج الحدث onreadystatechange.
إذا كان المعامل async للدعوة open() مسبقًا غير صحيح، فإن هذه الطريقة ستقوم بالتوقف وعدم العودة، حتى يتم تعيين حالة الـ readyState على 4 واستقبال استجابة الخادم بشكل كامل. وإلا، إذا كان المعامل async صحيحًا أو تم تمريره، يُستدعى send() فورًا ويُعالج استجابة الخادم في خلفية، كما سيتم شرحه لاحقًا.
إذا كان هناك إعادة توجيه HTTP في استجابة الخادم، يتبع طريقة send() أو السطر الخلفي التوجيه تلقائيًا. عند استلام جميع رؤوس الاستجابة HTTP، يضبط send() أو السطر الخلفي حالة الـ readyState على 3 ويقوم بتنشيط معالج الحدث onreadystatechange. إذا كانت الاستجابة طويلة، قد يُنشط send() أو السطر الخلفي معالج الحدث onreadystatechange في حالة 3: يمكن استخدام هذا كمؤشر تقدم التحميل. في النهاية، عند اكتمال الاستجابة، يضبط send() أو السطر الخلفي حالة الـ readyState على 4 ويقوم بتنشيط معالج الحدث للمرة الأخيرة.
XMLHttpRequest.setRequestHeader()
النحو
setRequestHeader(name, value)
الإشارة name هي اسم الرأس الذي سيتم تعيينه. لا يجب أن تشمل هذه الإشارة الفراغات أو الثقوب أو الرسائل النصية.
الإشارة value هي قيمة الرأس. لا يجب أن تشمل هذه الإشارة الرسائل النصية.
شرح
يحدد طريقة setRequestHeader() رأس HTTP لطلب HTTP، ويجب أن يتضمن هذا الرأس في الطلب الذي سيتم إصداره عبر دعوة send() التالية. يمكن تفعيل هذه الطريقة فقط عندما يكون حالة الـ readyState 1، مثل، بعد تفعيل دعوة open()، ولكن قبل تفعيل دعوة send().
إذا كان الرأس المحدد بالاسم المحدد مسبقًا قد تم تحديده، فإن القيمة الجديدة لهذا الرأس هي: القيمة المحددة مسبقًا، بالإضافة إلى الفاصلة والفراغات والقيمة المحددة بهذه الدعوة.
إذا تم تحديد الشهادة في استدعاء open()، يرسل XMLHttpRequest رأس الطلب Authorization المناسب تلقائيًا. ولكن يمكنك استخدام setRequestHeader() لضيف هذا الرأس. بنفس الطريقة، إذا كان الخادم الويب قد حفظ وقدم الكعكة المرتبطة بـ URL الذي تم تقديمه إلى open()، يتم تلقائيًا تضمين رؤوس Cookie أو Cookie2 المناسبة في الطلب. يمكنك إضافة هذه الكعك إلى الرؤوس من خلال استدعاء setRequestHeader(). يمكن أيضًا لـ XMLHttpRequest تقديم قيمة افتراضية للرأس User-Agent. إذا قام بذلك، يتم إضافة أي قيمة تحددها لهذا الرأس إلى القيمة الافتراضية.}
بعض رؤوس الطلبات يتم تعيينها تلقائيًا بواسطة XMLHttpRequest بدلاً من تعيينها بواسطة هذا الطريقة لتوافق protocal HTTP. هذا يشمل رؤوس الطلبات المتعلقة بالوكلات مثل:
- Host
- Connection
- Keep-Alive
- Accept-charset
- Accept-Encoding
- If-Modified-Since
- If-None-Match
- If-Range
- Range
- الصفحة السابقة DOM Text
- الصفحة التالية DOM XMLSerializer