1️⃣ ما هي GET؟
في بروتوكول HTTP فيه عدّة طرق (methods):GET, POST, PUT, DELETE, … الخ.
GET= نستخدمها لـ جلب البيانات فقط من API- ما يكون لها body (بالعادة).
- تعتبر آمنة و idempotent (يعني لو طلبتها 100 مرة المفروض نفس النتيجة، وما تغيّر بيانات في السيرفر).
مع Axios نستخدم:
axios.get(url, config?)
JavaScript2️⃣ الشكل الأساسي لـ axios.get
الصيغة العامة:
axios.get(url, config)
.then((response) => {
// التعامل مع البيانات
})
.catch((error) => {
// التعامل مع الخطأ
});
JavaScriptأو مع async/await:
try {
const response = await axios.get(url, config);
// التعامل مع response
} catch (error) {
// التعامل مع الخطأ
}
JavaScriptالبرامترين:
- url (إجباري)
رابط الـ API، مثل:'https://api.example.com/users' '/api/users' - config (اختياري)
كائن (object) يحتوي إعدادات الطلب:paramsheaderstimeoutresponseTypewithCredentials- إلخ (بنشرحها تحت).
3️⃣ أهم الخيارات داخل config مع GET
🔹 (1) params – للـ Query String
بدال ما تكتب الـ query string يدويًا في الرابط، Axios يسهّلها لك:
axios.get('https://api.example.com/users', {
params: {
page: 2,
limit: 10,
search: 'ahmed',
},
});
JavaScriptهذا يترجم تلقائيًا إلى:
https://api.example.com/users?page=2&limit=10&search=ahmed
JavaScriptليش هذا أفضل؟
- أسهل للقراءة.
- يحميك من مشاكل الترميز (encoding) لما يكون عندك حروف خاصة أو عربية.
🔹 (2) headers – إرسال هيدرات خاصة
مثلاً توكن JWT:
axios.get('/api/me', {
headers: {
Authorization: `Bearer ${token}`,
'X-Custom-Header': 'example',
},
});
JavaScriptمفيد في:
- الـ Auth (تسجيل الدخول / توكن).
- تحديد نوع المحتوى
Content-Type(مع أنه في GET غالبًا ما تحتاج).
🔹 (3) timeout – مهلة الطلب
لو السيرفر تأخر، تقدر تخلي الطلب يقطع بعد مدة معينة (بالملّي ثانية):
axios.get('/api/users', {
timeout: 5000, // 5 ثواني
});
JavaScriptلو تجاوز الوقت → Axios يرمي خطأ (Timeout).
🔹 (4) responseType – نوع البيانات المتوقعة
الوضع الافتراضي: json
تقدر تغيّره مثلاً لو حاب تحمل ملف:
axios.get('/file.pdf', {
responseType: 'blob', // أو 'arraybuffer'
});
JavaScriptأنواع شائعة:
json(افتراضي)blob(للملفات)textarraybuffer
🔹 (5) withCredentials – مع الـ Cookies
لو تتعامل مع API تستخدم cookies بين الدومينات:
axios.get('https://api.example.com/profile', {
withCredentials: true,
});
JavaScriptهذا يخلي المتصفح يرسل الـ cookies مع الطلب.
🔹 (6) validateStatus – التحكم متى يعتبر الطلب ناجح
افتراضيًا Axios يعتبر أي status بين 200 و < 300 ناجح.
تقدر تغيّر هذا السلوك:
axios.get('/api/users', {
validateStatus: function (status) {
// اعتبر كل شيء أقل من 500 "نجاح"
return status < 500;
},
});
JavaScriptلو رجع status ما ينطبق على الدالة → Axios يرمي خطأ وتروح للـ catch.
4️⃣ شكل الـ response اللي يرجع من axios.get
لما الطلب ينجح، Axios يرجع لك كائن مثل:
const response = await axios.get('/api/users');JavaScriptالـ response يحتوي:
response.data→ البيانات اللي رجعت من السيرفر (الأهم).response.status→ رقم الحالة (200, 201, 404, 500…).response.statusText→ نص الحالة (OK, Not Found…).response.headers→ الهيدرات اللي رجعت.response.config→ إعدادات الطلب نفسه.response.request→ كائن الطلب (مو دايم تحتاجه).
أنت كمبتدئ أهم شيء تهتم فيه غالبًا:
response.data
response.status
JavaScript5️⃣ التعامل مع الأخطاء في GET
مع .then / .catch:
axios.get('/api/users')
.then((response) => {
console.log(response.data);
})
.catch((error) => {
if (error.response) {
// السيرفر ردّ بكود خطأ (مثلاً 400 أو 500)
console.log('Status:', error.response.status);
console.log('Data:', error.response.data);
} else if (error.request) {
// الطلب طلع من جهازك لكن ما فيه رد من السيرفر
console.log('No response from server');
} else {
// خطأ في إعدادات الطلب قبل الإرسال
console.log('Error', error.message);
}
});
JavaScriptمع async/await:
try {
const response = await axios.get('/api/users');
console.log(response.data);
} catch (error) {
if (error.response) {
console.log('Status:', error.response.status);
console.log('Data:', error.response.data);
} else if (error.request) {
console.log('No response from server');
} else {
console.log('Error', error.message);
}
}
JavaScriptمهم تفهم:
error.responseموجود لو السيرفر ردّ فعليًا لكن بكود خطأ (مثلاً 404).error.requestموجود لو الطلب خرج لكن ما رجع رد (مشكلة شبكة أو سيرفر طافي).- لو الاثنين فاضيين → مشكلة في الكود نفسه (URL غلط، config غلط، …).
6️⃣ مثال عملي كامل في React باستخدام axios.get
نكتب كومبوننت بسيط يعرض قائمة مقالات مثلاً:
import React, { useEffect, useState } from 'react';
import axios from 'axios';
function PostsList() {
const [posts, setPosts] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
// دالة async داخل useEffect
const fetchPosts = async () => {
try {
setLoading(true);
setError(null);
const response = await axios.get(
'https://jsonplaceholder.typicode.com/posts',
{
params: {
_limit: 5, // مثال على params
},
timeout: 8000, // 8 ثواني
}
);
setPosts(response.data); // البيانات مباشرة
} catch (err) {
setError('حدث خطأ أثناء جلب البيانات');
console.error(err);
} finally {
setLoading(false);
}
};
fetchPosts();
}, []); // نشتغل مرة واحدة لما الكومبوننت يشتغل أول مرة
if (loading) return <p>جاري التحميل...</p>;
if (error) return <p>{error}</p>;
return (
<ul>
{posts.map((post) => (
<li key={post.id}>
<strong>{post.title}</strong>
</li>
))}
</ul>
);
}
export default PostsList;
JavaScriptفي هذا المثال استخدمنا:
axios.get(url, { params, timeout })response.dataمباشرة.- إدارة:
loadingerrordata
7️⃣ ملخص سريع لطريقة التفكير في axios.get
- ابداء بأبسط شكل:
const res = await axios.get('/api/users'); console.log(res.data); - لما تحتاج:
- فلترة / Pagination → استخدم
params. - توكين / هيدر خاص → استخدم
headers. - مهلة زمنية → استخدم
timeout. - ملف / نوع مختلف من الرد → استخدم
responseType.
- فلترة / Pagination → استخدم
- دايم ركّز على:
response.dataللنجاح.error.responseللأخطاء من السيرفر.
✅ الطريقة الصحيحة (الأبسط)
ما تحتاج thenين أصلاً، خليك في واحد:
const getPosts = () => {
axios
.get("https://jsonplaceholder.typicode.com/posts")
.then(res => {
console.log(res.data);
setPosts(res.data);
})
.catch(err => {
console.error(err);
});
};
JavaScriptهنا:
resيجي منaxios.get.- تطبع البيانات.
- بعدها مباشرة تحفظها في الـ state.
✅ لو فعلاً حاب تستخدم then مرتين (للتعلّم)
تقدر تكتبها هكذا:
const getPosts = () => {
axios
.get("https://jsonplaceholder.typicode.com/posts")
.then(res => {
console.log(res.data);
return res.data; // مهم جداً
})
.then(data => {
setPosts(data);
})
.catch(err => {
console.error(err);
});
};
JavaScriptالفرق:
- أول
thenيرجّعres.data. - ثاني
thenيستقبلها فيdata.
🔥 نصيحة سريعة
مع React و axios، غالبًا هتكتبها كذا:
const getPosts = async () => {
try {
const res = await axios.get("https://jsonplaceholder.typicode.com/posts");
console.log(res.data);
setPosts(res.data);
} catch (err) {
console.error(err);
}
};
JavaScriptأوضح وأسهل للقراءة من تداخل then.
مثال كامل:
import axios from "axios"
import { useState, useEffect } from "react"
function Posts() {
const [posts, setPosts] = useState([]);
const [err, setErr] = useState([]);
// const getData = ()=> {
// axios.get("http://localhost:8000/posts")
// .then(res => {
// const {data , status} = res;
// console.log(data)
// });
// }
const getData = async () => {
try {
const { data, status } = await axios.get("http://localhost:8000/posts")
// console.log(data, status)
setPosts(data);
} catch (err) {
// console.log(err.message)
setErr(err.message)
}
}
const deletePost =async (id)=> {
const res = await axios.delete(`http://localhost:8000/posts/${id}`);
setPosts(prev => prev.filter(post => post.id !== id));
console.log(res)
}
useEffect(() => {
getData();
}, []);
return (
<div>
<h1>All Posts</h1>
{
posts.length ? posts.map((post)=> (
<>
<p className="btn btn-danger">{post.id}</p>
<div className="">
<button onClick={()=> deletePost(post.id)} className="btn btn-danger">Delete</button>
</div>
<h2>{post.title}</h2>
<p>{post.body}</p>
</>
)) : <h4 className="alert alert-danger">{err}</h4>
}
</div>
)
}
export default PostsJavaScript