انتقل إلى محتوى الدرس
الدرس 128
تاريخ النشر: تاريخ التحديث:
دورة جافا سكريبت

إرسال طلبات الشبكة عبر AJAX في JavaScriptAJAX Sending Server Requests طريقة تهيئة الطلب open وsend، وإرسال معاملات GET بأمان، وإرسال POST وضبط الرؤوس

أرسل طلبات AJAX بأمان في JavaScript: أتقن تهيئة xhr.open وxhr.send، وإبقاء الوضع غير المتزامن true، وترميز معاملات GET بـ encodeURIComponent، وضبط رؤوس POST.
أقسام الدرس
4
الأمثلة
2
اللغة
العربية
المشاهدات
2,937
محتوى الدرس
في هذا الدرس 4تصفّح المواضيع

يفصل الكائن XMLHttpRequest دائماً بين مرحلة إعداد الطلب ومرحلة إطلاقه الفعلي عبر الشبكة في خطوتين واضحتين:

  • xhr.open(method, url, true): تهيّئ طريقة الطلب ("GET" أو "POST") وعنوان الوجهة والوضع غير المتزامن، دون إرسال أي بايت بعد.
  • xhr.send(body): تطلق الطلب فعلياً عبر الشبكة؛ وتُستدعى فارغة لطلبات GET، بينما يُمرر بداخلها جسم البيانات لطلبات POST.
مخطط الترتيب الإلزامي لإرسال طلب AJAX: ترميز الرابط ثم open ثم setRequestHeader ثم send

تأخذ القيمة الافتراضية للمعامل الثالث في xhr.open(method, url, true) القيمة true دائماً. إياك وتمرير false على خيط الواجهة الرئيسي! فالطلب المتزامن المهجور يجمد تبويب المتصفح بالكامل ويوقف الأزرار والتمرير ريثما يرد الخادم، بل وتمنع المتصفحات الحديثة استخدام خصائص المهلة ونوع الرد معه.

اقصر طلبات GET حصراً على عمليات القراءة والاستعلام (كالبحث والترشيح)، ولا ترسل بها كلمات مرور أو أوامر حذف وتعديل أبداً! وعند دمج نص كتبه الزائر في الرابط، مرّره دائماً عبر encodeURIComponent(val) لتحويل الرموز الخاصة مثل C++ وR&D إلى ترميز آمن لا يقطع المعاملات:

طريقة الطلبمكان انتقال البياناتالطبيعة والتخزين المؤقتالقاعدة الأمنية الواجبة
GETسلسلة الاستعلام بالرابط (?q=...)قراءة فقط، قابلة للمشاركة والتخزين المؤقتترميز المدخلات بـ encodeURIComponent() وحظر إرسال الأسرار بالرابط
POSTجسم الرسالة داخل xhr.send(body)تنشئ أو تعدّل بيانات بالخادم ولا تُخزن مؤقتاًضبط حقل رأس الطلب Content-Type بعد open()
JavaScript
const rawTopic = 'C++ & Async #1';
const safeQuery = '?topic=' + encodeURIComponent(rawTopic);
const out = document.getElementById('get-out');
const xhr = new XMLHttpRequest();
const demoUrl = 'data:application/json,' +
  encodeURIComponent(JSON.stringify({ sent: safeQuery }));
xhr.onload = () => {
  out.textContent = JSON.parse(xhr.responseText).sent;
};
xhr.open('GET', demoUrl, true);
xhr.send();

عند إرسال بيانات داخل جسم طلب POST، أخبر الخادم بنوع التنسيق المرسل عبر الدالة xhr.setRequestHeader(name, value) مع الالتزام باستدعائها بعد open() وقبل send() حصراً:

  • جسم JSON: اضبط الرأس على "application/json" وأرسل JSON.stringify(data).
  • بيانات نموذج نصية: اضبط الرأس على "application/x-www-form-urlencoded".
  • كائن FormData للملفات: مرّره مباشرةً إلى xhr.send(fd) دون ضبط الرأس يدوياً ليولّد المتصفح حد الفصل التلقائي بدقة!
JavaScript
const body = JSON.stringify({ item: 'JS Guide', qty: 2 });
const url = 'data:application/json,' + encodeURIComponent(body);
document.getElementById('send-btn').onclick = () => {
  const xhr = new XMLHttpRequest();
  xhr.onload = () => {
    const out = document.getElementById('post-out');
    out.textContent = 'Delivered: ' + xhr.responseText;
  };
  xhr.open('GET', url, true);
  xhr.setRequestHeader('Accept', 'application/json');
  xhr.send();
};
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس تهيئة وإطلاق الطلبات عبر xhr.open() وxhr.send()، والالتزام بالوضع غير المتزامن true، وترميز معاملات GET عبر encodeURIComponent()، وضبط حقول رأس الطلب لبيانات POST بالترتيب الصحيح. الخطوة التالية: انتقل إلى درس «استقبال ومعالجة استجابة الخادم في AJAX» لقراءة الردود وحقول رأس الاستجابة باحترافية.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات3

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 3 مفهومةأول بطاقة، أول خطوة
01 xhr.open(method, url, true) دالة تهيئة الطلب xhr.open
تجهز طريقة الطلب وعنوانه والوضع غير المتزامن قبل إضافة حقول الرأس أو بدء الإرسال.
للمراجعة
02 xhr.setRequestHeader() دالة ضبط رأس الطلب setRequestHeader
تضيف حقل رأس إلى الطلب مثل نوع المحتوى، ويشترط استدعاؤها بعد open وقبل send حصراً.
للمراجعة
03 encodeURIComponent() دالة ترميز المعاملات encodeURIComponent
تحوّل المحارف الخاصة والمسافات إلى صيغة مئوية آمنة لئلا تكسر بنية معاملات الرابط.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات2

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 2 مفهومةأول بطاقة، أول خطوة
01 GET GET
HTTP GET Method
طريقة طلب قياسية مخصصة لاسترجاع البيانات وقراءتها دون إحداث تغيير على الخادم.
للمراجعة
02 POST POST
HTTP POST Method
طريقة طلب قياسية ترسل البيانات داخل جسم الرسالة لإنشاء سجلات أو معالجتها بالخادم.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. افتح مثال ترميز استعلام GET في محرر التجربة وعدّل النص ليحتوي على % و& وتحقق من سلامة الناتج.

  2. قارن بين التبويب الثاني والتبويب الثالث في المحاكي للتثبت من وجوب استدعاء open قبل setRequestHeader.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

10أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي10 أسئلة تنتظرك
01

متى يجب استدعاء الدالة xhr.setRequestHeader() تحديداً في تسلسل أوامر الكائن؟

02

تمرير القيمة false في المعامل الثالث للدالة xhr.open ممارسة مهجورة لأنها تجمد واجهة المتصفح بالكامل.

03

لماذا يجب تمرير النص المدخل "R&D" عبر encodeURIComponent() قبل دمجه في رابط استعلام؟

04

أي دالة تبدأ الإرسال الفعلي للطلب عبر الشبكة بعد تهيئته؟

05

يُعد إرسال كلمات المرور وبيانات الدفع داخل روابط GET آمناً تماماً بمجرد استخدام encodeURIComponent.

06

عند تمرير كائن FormData مباشرةً داخل xhr.send(formData)، ما التصرف الصحيح بشأن حقل رأس Content-Type؟

07

ما قيمة حقل الرأس Content-Type الصحيحة عند إرسال نص ناتج عن JSON.stringify داخل xhr.send()؟

08

يمنع المتصفح أمنياً السكربتات الأمامية من تزوير حقول الرأس المحمية مثل Origin أو Host داخل setRequestHeader.

09

ما القيمة الافتراضية للمعامل الثالث (async) في الدالة xhr.open عند عدم كتابته؟

10

أي طريقة طلب هي الأنسب لتعديل أو إنشاء بيانات فعلية على الخادم بدلاً من GET المخصصة للقراءة؟