تحويل أوامر curl إلى كود JavaScript - توليد كود JavaScript fetch/axios جاهز للاستخدام لطلبات API
// JavaScript code will appear here // Example: // Using fetch API fetch('https://api.example.com/data', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'test' }) }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error));
فيما يلي بعض أوامر curl الشائعة التي يمكنك تحويلها إلى كود JavaScript:
curl https://api.example.com/users
curl -X POST -H "Content-Type: application/json" -d '{"name":"John","email":"[email protected]"}' https://api.example.com/users
curl -X PUT -H "Authorization: Bearer token123" -d '{"status":"active"}' https://api.example.com/users/1
curl -X DELETE https://api.example.com/users/1
curl -H "X-API-Key: abc123" -H "Accept: application/json" https://api.example.com/data
يوفر JavaScript طرقاً متعددة لإجراء طلبات HTTP. فيما يلي أنماط شائعة باستخدام كل من واجهة Fetch API و Axios:
const formData = new FormData(); formData.append('file', document.querySelector('#fileInput').files[0]); fetch('https://api.example.com/upload', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_TOKEN_HERE' }, body: formData }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error));
const controller = new AbortController(); const signal = controller.signal; // Set timeout of 5 seconds const timeoutId = setTimeout(() => controller.abort(), 5000); fetch('https://api.example.com/data', { method: 'GET', signal: signal }) .then(response => { if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } clearTimeout(timeoutId); return response.json(); }) .then(data => console.log(data)) .catch(error => { if (error.name === 'AbortError') { console.error('Request timed out'); } else { console.error('Error:', error); } });
انسخ أمر curl الخاص بك → الصقه في مربع الإدخال → احصل على كود JavaScript فوراً
axios.get('https://api.example.com/data') .then(response => { console.log(response.data); }) .catch(error => { if (error.response) { // Server returned an error status code console.error(`Server error: ${error.response.status}`); console.error(error.response.data); } else if (error.request) { // Request was made but no response received console.error('Network error - no response received'); } else { // Error in request setup console.error('Request error:', error.message); } });
// Using fetch with AbortController const controller = new AbortController(); const signal = controller.signal; // Cancel request after 5 seconds setTimeout(() => controller.abort(), 5000); fetch('https://api.example.com/data', { signal }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => { if (error.name === 'AbortError') { console.log('Request was cancelled'); } else { console.error('Error:', error); } }); // Using axios with CancelToken const source = axios.CancelToken.source(); // Cancel request after 5 seconds setTimeout(() => { source.cancel('User cancelled the request'); }, 5000); axios.get('https://api.example.com/data', { cancelToken: source.token }) .then(response => console.log(response.data)) .catch(error => { if (axios.isCancel(error)) { console.log('Request cancelled:', error.message); } else { console.error('Error:', error); } });
ج: بينما curl هي أداة سطر أوامر لإجراء طلبات HTTP، توفر واجهة fetch API في JavaScript واجهة برمجية داخل متصفحات الويب و Node.js. تستخدم Fetch الوعود (Promises) للتعامل مع العمليات غير المتزامنة، بينما ينفذ curl بشكل متزامن. بالإضافة إلى ذلك، تتبع fetch إعادة التوجيه تلقائياً ولا ترسل ملفات تعريف الارتباط افتراضياً، بينما يقوم curl بكليهما ما لم يتم تكوينه بخلاف ذلك.
ج: Fetch مدمجة في المتصفحات الحديثة ولكنها تتطلب المزيد من الكود المتكرر لمعالجة الأخطاء ولا تقوم تلقائياً بتحليل استجابات JSON. Axios هي مكتبة توفر واجهة برمجة أكثر ثراءً بالميزات مع تحليل تلقائي لـ JSON، ومعالجة أفضل للأخطاء، واعتراض الطلب/الاستجابة، وإلغاء الطلب المدمج. يعمل Axios أيضاً بشكل متسق عبر بيئات المتصفحات و Node.js.
ج: تنطبق قيود CORS (مشاركة الموارد عبر الأصول المتعددة) على JavaScript المستندة إلى المتصفح ولكن ليس على curl. عند تحويل أوامر curl إلى JavaScript، قد تواجه أخطاء CORS إذا لم يتضمن الخادم رؤوس CORS المناسبة. تشمل الحلول: استخدام وكيل CORS، أو طلب من مالك API تمكين رؤوس CORS، أو تنفيذ وكيل من جانب الخادم في تطبيقك، أو استخدام Node.js للطلبات التي لا تعمل في المتصفح.
ج: في JavaScript المستندة إلى المتصفح، لا يمكنك تجاوز التحقق من شهادة TLS لأنها ميزة أمان يفرضها المتصفح. في Node.js، يمكنك تعيين خيار rejectUnauthorized: false
في تكوين وكيل HTTPS. ومع ذلك، لا يُنصح بهذا في الإنتاج لأنه يقوض الأمان. مثال: const https = require('https'); const agent = new https.Agent({rejectUnauthorized: false});
ج: للتعامل مع تحميلات الملفات في JavaScript بشكل مشابه لعلامة -F في curl، استخدم واجهة FormData. على سبيل المثال: const formData = new FormData(); formData.append('file', fileInput.files[0]); formData.append('field', 'value'); fetch('https://api.example.com/upload', { method: 'POST', body: formData });
يعمل هذا النهج مع كل من fetch و axios.
ج: مع واجهة fetch API، استخدم AbortController مع setTimeout: const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 5000); fetch(url, { signal: controller.signal });
مع axios، استخدم خيار timeout: axios.get(url, { timeout: 5000 });
يتيح لك كلا النهجين التحكم في مدة الانتظار قبل إلغاء الطلب.
ج: بينما يوفر curl علامة -v/--verbose للحصول على معلومات مفصلة عن الطلب/الاستجابة، يوفر JavaScript أدوات تصحيح مختلفة. في المتصفحات، استخدم علامة التبويب Network في DevTools لفحص الطلبات والرؤوس والحمولات والتوقيت. للتصحيح البرمجي، يمكنك استخدام معترضات axios لتسجيل تفاصيل الطلب/الاستجابة أو تنفيذ تسجيل مخصص مع fetch. في Node.js، يمكنك استخدام مكتبات مثل 'http-debug' أو تعيين متغير البيئة NODE_DEBUG=http.
فهم أوامر curl ضروري لاختبار API الفعال مع JavaScript. إليك مرجعاً سريعاً لخيارات curl الشائعة التي يدعمها محولنا:
curl [options] [URL]
-X, --request METHOD
: Specify request method (GET, POST, PUT, DELETE, etc.)-H, --header LINE
: Add header to the request-d, --data DATA
: Send data in POST request-F, --form CONTENT
: Submit form data-u, --user USER:PASSWORD
: Server user and password-k, --insecure
: Allow insecure server connections-I, --head
: Show document info only-v, --verbose
: Make the operation more verbose-s, --silent
: Silent mode--connect-timeout SECONDS
: Maximum time for connectionيتعامل محول JavaScript لدينا مع أوامر curl المعقدة بما في ذلك الرؤوس المتعددة والمصادقة وحمولات البيانات والخيارات المختلفة. ما عليك سوى لصق أمر curl الخاص بك والحصول على كود JavaScript نظيف وحديث باستخدام إما واجهة Fetch API أو Axios.
عند العمل مع واجهة Fetch API أو Axios في JavaScript، اتبع أفضل الممارسات التالية للتفاعلات الفعالة والآمنة مع API:
// Using async/await with fetch async function fetchData() { try { const response = await fetch('https://api.example.com/data'); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error('Fetch error:', error); } } // Using async/await with axios async function fetchDataWithAxios() { try { const response = await axios.get('https://api.example.com/data'); console.log(response.data); return response.data; } catch (error) { console.error('Axios error:', error); } }
async function fetchWithRetry(url, options = {}, retries = 3, backoff = 300) { try { const response = await fetch(url, options); return response; } catch (error) { if (retries <= 1) throw error; await new Promise(resolve => setTimeout(resolve, backoff)); return fetchWithRetry(url, options, retries - 1, backoff * 2); } }
// Create configurable API client with axios const apiClient = axios.create({ baseURL: 'https://api.example.com', timeout: 10000, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } }); // Add request interceptors apiClient.interceptors.request.use(config => { // Do something before request is sent const token = localStorage.getItem('token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, error => { return Promise.reject(error); }); // Add response interceptors apiClient.interceptors.response.use(response => { // Any status code within 2xx range return response; }, error => { // Handle 401 Unauthorized errors if (error.response && error.response.status === 401) { console.log('Unauthorized, please login again'); } return Promise.reject(error); }); // Use the API client apiClient.get('/users') .then(response => console.log(response.data)) .catch(error => console.error(error));
// Using Promise.all with fetch async function fetchMultipleResources() { try { const [users, products, orders] = await Promise.all([ fetch('https://api.example.com/users').then(res => res.json()), fetch('https://api.example.com/products').then(res => res.json()), fetch('https://api.example.com/orders').then(res => res.json()) ]); console.log({ users, products, orders }); return { users, products, orders }; } catch (error) { console.error('Error fetching data:', error); } } // Using axios.all for concurrent requests async function fetchMultipleResourcesWithAxios() { try { const [users, products, orders] = await axios.all([ axios.get('https://api.example.com/users'), axios.get('https://api.example.com/products'), axios.get('https://api.example.com/orders') ]); console.log({ users: users.data, products: products.data, orders: orders.data }); } catch (error) { console.error('Error fetching data:', error); } }
// Simple in-memory cache implementation const cache = new Map(); async function fetchWithCache(url, options = {}, ttl = 60000) { const cacheKey = `${url}-${JSON.stringify(options)}`; // Check cache const cachedItem = cache.get(cacheKey); if (cachedItem && Date.now() < cachedItem.expiry) { console.log('Using cached data'); return cachedItem.data; } // If no cache or expired, make the request const response = await fetch(url, options); const data = await response.json(); // Update cache cache.set(cacheKey, { data, expiry: Date.now() + ttl }); return data; }