Axios هو عميل HTTP مفتوح المصدر لجافا سكريبت وتايب سكريبت، يعمل في كل من المتصفح وبيئة Node.js. توفر المكتبة واجهة مريحة قائمة على Promise لإرسال طلبات HTTP مع دعم المعترضات والتسلسل التلقائي لـ JSON وإمكانية إلغاء الطلبات. وفقاً لـ المستودع الرسمي على GitHub، يضم المشروع أكثر من 100 ألف نجمة. Axios هي واحدة من أشهر المكتبات للعمل مع REST API في نظام JavaScript البيئي.
الملخص
Axios هي مكتبة جافا سكريبت مصممة لتنفيذ طلبات HTTP من المتصفح وبيئة Node.js. وهي مبنية فوق XMLHttpRequest في المتصفح ووحدة http في Node.js، مما يوفر واجهة برمجة موحدة لكلا المنصتين.
الميزة الرئيسية لـ Axios مقارنة بـ fetch الأصلي هي المعالجة التلقائية لـ JSON، ودعم المعترضات، ومعالجة الأخطاء بشكل أكثر ملاءمة. على عكس fetch، لا يتطلب Axios استدعاءين .then للحصول على نص استجابة JSON ويطرح استثناء تلقائياً عند أخطاء HTTP (4xx, 5xx).
تدعم المكتبة جميع طرق HTTP الرئيسية: GET، POST، PUT، DELETE، PATCH و HEAD. يمكن استخدامها في المشاريع البسيطة وفي تطبيقات المؤسسات الكبيرة التي تتعامل مع مئات الآلاف من الطلبات يومياً.
هندسة Axios تعتمد على مفهوم المحولات (adapters). تقوم المكتبة بتجريد طبقة النقل: تستخدم XMLHttpRequest في المتصفح ووحدة http أو https في Node.js. مما يوفر واجهة واحدة بغض النظر عن بيئة التشغيل.
يمر كل طلب عبر سلسلة من المعترضات التي يمكنها تعديل تكوين الطلب أو الاستجابة. بعد المعترضات، يتم تمرير الطلب إلى المحول الذي ينفذ استدعاء HTTP الفعلي. ثم تمر الاستجابة عبر معترضات الاستجابة قبل الوصول إلى كود التطبيق.
Axios تتضمن العديد من الميزات المدمجة التي تجعلها خياراً مناسباً للعمل مع HTTP في تطبيقات الجوال والويب. دعنا نستعرض أهمها.
عند إرسال طلب، يقوم Axios تلقائياً بتحويل كائن JavaScript إلى سلسلة JSON باستخدام JSON.stringify. وعند استلام الاستجابة، تقوم المكتبة بتحليل JSON مرة أخرى إلى كائن. وهذا يوفر على المطور عناء التسلسل وإلغاء التسلسل اليدوي للبيانات.
في بيئة المتصفح، يضيف Axios تلقائياً رؤوس XSRF-TOKEN من ملفات تعريف الارتباط، مما يحمي التطبيق من تزوير الطلبات عبر المواقع. للقيام بذلك، يكفي تكوين الخادم لإرسال الرمز المميز في ملف تعريف ارتباط باسم XSRF-TOKEN.
تدعم المكتبة تعيين مهلة عبر معلمة timeout وإلغاء الطلب عبر AbortController. وهذا مهم بشكل خاص في تطبيقات الجوال ذات الاتصالات غير المستقرة، حيث تستهلك الطلبات المعلقة البطارية والبيانات.
تثبيت Axios يتم عبر أي مدير حزم. المكتبة متاحة في سجل npm ويمكن استخدامها في مشاريع Node.js والمتصفح. بالنسبة لـ TypeScript، الأنواع مضمنة في الحزمة الرئيسية — لا حاجة لتبعيات إضافية.
بعد التثبيت، يمكنك إنشاء مثيل بتكوين أساسي: URL أساسي، مهلة افتراضية، رؤوس مشتركة. وهذا يسمح بعدم تكرار نفس المعلمات في كل طلب وإدارة إعدادات عميل HTTP مركزياً.
# التثبيت عبر npm
npm install axios
# التثبيت عبر yarn
yarn add axios
# التثبيت عبر pnpm
pnpm add axios
يوصى بإنشاء مثيل منفصل Axios لكل خدمة API. وهذا يسمح بتعيين URL أساسي ورؤوس قياسية ومهلة سيتم تطبيقها على جميع طلبات هذا المثيل دون تكرارها في كل استدعاء.
import axios from 'axios';
const api = axios.create({
baseURL: 'https://api.example.com/v1',
timeout: 10000,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
أمثلة الطلبات توضح الأنماط الرئيسية لاستخدام Axios. جميع الأمثلة تستخدم صيغة async/await التي تجعل الكود غير المتزامن أكثر قابلية للقراءة مقارنة بسلاسل .then().
لجلب البيانات من الخادم، يتم استخدام طريقة axios.get. تُمرر معلمات الطلب عبر كائن params الذي يتحول تلقائياً إلى سلسلة استعلام. تحتوي الاستجابة على البيانات في حقل data والحالة في status والرؤوس في headers.
interface User {
id: number;
name: string;
email: string;
}
async function getUsers() {
try {
const response = await api.get<User[]>('/users', {
params: { page: 1, limit: 10 }
});
return response.data;
} catch (error) {
console.error('خطأ في تحميل المستخدمين', error);
throw error;
}
}
لإرسال البيانات إلى الخادم، يتم استخدام axios.post. الوسيطة الثانية هي كائن بالبيانات، والذي يقوم Axios بتسلسله تلقائياً إلى JSON. يتم تعيين نوع المحتوى Content-Type إلى application/json افتراضياً.
interface CreateUserDto {
name: string;
email: string;
role: string;
}
async function createUser(data: CreateUserDto) {
const response = await api.post<User>('/users', data);
return response.data;
}
المعترضات هي دوال وسيطة (middleware) يتم تنفيذها لكل طلب أو استجابة. تسمح بإضافة رموز التفويض، وتسجيل الطلبات، ومعالجة الأخطاء مركزياً. يضيف معترض الطلب رأس Authorization مع رمز مميز مسترجع من التخزين.
// معترض الطلب — يضيف رمز التفويض
api.interceptors.request.use(
(config) => {
const token = getToken();
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
(error) => Promise.reject(error)
);
// معترض الاستجابة — يعالج أخطاء 401
api.interceptors.response.use(
(response) => response,
(error) => {
if (error.response?.status === 401) {
redirectToLogin();
}
return Promise.reject(error);
}
);
معالجة الأخطاء في Axios تُبنى على آلية الاستثناءات. على عكس fetch، يلتقط Axios تلقائياً أخطاء HTTP (4xx, 5xx) ويمررها إلى كتلة catch. يحتوي كائن الخطأ على معلومات حول استجابة الخادم والطلب وسياق التنفيذ.
من المهم التمييز بين ثلاثة أنواع من الأخطاء: خطأ استجابة الخادم (response)، خطأ الطلب (request) وخطأ التكوين (config). الأول يحدث عند تنفيذ استدعاء HTTP بنجاح ولكن مع رمز خطأ، والثاني عند عدم وجود استجابة من الخادم، والثالث عند تكوين طلب غير صحيح.
import axios, { AxiosError } from 'axios';
async function safeRequest() {
try {
return await api.get('/data');
} catch (error) {
if (error instanceof AxiosError) {
if (error.response) {
console.warn('خطأ في الاستجابة', error.response.status);
} else if (error.request) {
console.warn('لا توجد استجابة من الخادم');
} else {
console.warn('خطأ في التكوين');
}
}
}
}
| طريقة HTTP | طريقة Axios | الوصف |
|---|---|---|
| GET | axios.get(url, config) | جلب البيانات |
| POST | axios.post(url, data, config) | إنشاء مورد |
| PUT | axios.put(url, data, config) | تحديث مورد |
| DELETE | axios.delete(url, config) | حذف مورد |
| PATCH | axios.patch(url, data, config) | تحديث جزئي |
مقارنة Axios مع Fetch API الأصلي تساعد في تحديد متى تكون كل تقنية مناسبة. Fetch هي API مدمجة في المتصفح ولا تتطلب تثبيتاً. Axios هي مكتبة خارجية بميزات إضافية. للطلبات البسيطة، fetch كافية؛ للتطبيقات المعقدة ذات المعترضات والمعالجة المركزية للأخطاء، Axios أكثر ملاءمة.
Fetch لا تعتبر أخطاء HTTP (4xx, 5xx) استثناءات — يجب التحقق من response.ok. Fetch تتطلب استدعاءين .then() للحصول على JSON: response.json() ثم تُرجع Promise بالبيانات. Axios يفعل ذلك تلقائياً. Fetch لا تدعم تقدم رفع الملفات بدون إضافات إضافية. Axios يوفر onUploadProgress و onDownloadProgress مدمجين.
في Node.js، Fetch متاح منذ الإصدار 18 كميزة تجريبية، بينما يعمل Axios بشكل مستقر منذ Node.js 10. للمشاريع التي تدعم إصدارات Node.js القديمة، يكون الاختيار واضحاً لصالح Axios. لمشاريع المتصفح الحديثة دون معالجة طلبات معقدة، قد يكون fetch كافياً.
الأسئلة الشائعة
Axios يحلل JSON تلقائياً، ويطرح استثناءات عند أخطاء HTTP، ويدعم المعترضات. Fetch يتطلب استدعاءين .then لـ JSON ولا يعالج 4xx/5xx كأخطاء. كما أن Axios أسهل في التكوين عبر كائن الإعدادات.
لا، أنواع TypeScript مضمنة في الحزمة الرئيسية axios. لا حاجة لتبعيات إضافية مثل @types/axios — يكفي استيراد axios من الحزمة التي تحمل الاسم نفسه.
استخدم AbortController: أنشئ مثيل AbortController ومرر signal الخاص به إلى تكوين الطلب. عند استدعاء controller.abort()، سيتم إلغاء الطلب وسيتم رفض Promise برسالة خطأ مناسبة.
نعم، Axios متوافق تماماً مع React Native. تستخدم المكتبة XMLHttpRequest المدمج والمتوفر في بيئة React Native. جميع الميزات، بما في ذلك المعترضات وإلغاء الطلبات، تعمل دون تكوين إضافي.
استخدم معترض طلب لإضافة رأس Authorization بشكل مركزي. وهذا يلغي الحاجة إلى تحديد الرمز المميز في كل طلب على حدة ويسمح بمعالجة موحدة لانتهاء صلاحية الرمز.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.