تبدیل دستورات 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 از Promiseها برای مدیریت عملیاتهای ناهمگام استفاده میکند، در حالی که curl به صورت همگام اجرا میشود. علاوه بر این، fetch به طور خودکار تغییر مسیرها را دنبال میکند و به طور پیشفرض کوکیها را ارسال نمیکند، در حالی که curl هر دو را انجام میدهد مگر اینکه به گونهای دیگر پیکربندی شود.
ج: Fetch در مرورگرهای مدرن داخلی است اما به کد بیشتری برای مدیریت خطا نیاز دارد و به طور خودکار پاسخهای JSON را تجزیه نمیکند. Axios یک کتابخانه است که API غنیتری با تجزیه خودکار JSON، مدیریت خطای بهتر، رهگیری درخواست/پاسخ و لغو درخواست داخلی ارائه میدهد. Axios همچنین به طور یکنواخت در مرورگرها و محیطهای Node.js کار میکند.
ج: محدودیتهای CORS (اشتراکگذاری منابع بین منشأها) برای JavaScript مبتنی بر مرورگر اعمال میشود اما برای curl خیر. هنگام تبدیل دستورات curl به JavaScript، ممکن است با خطاهای CORS مواجه شوید اگر سرور هدرهای CORS مناسب را شامل نکند. راهحلها شامل: استفاده از پروکسی CORS، درخواست از مالک API برای فعالسازی هدرهای CORS، پیادهسازی یک پروکسی سمت سرور در برنامه خود، یا استفاده از Node.js برای درخواستهایی که در مرورگر اجرا نمیشوند.
ج: در JavaScript مبتنی بر مرورگر، نمیتوانید تأیید گواهی SSL را دور بزنید زیرا این یک ویژگی امنیتی است که توسط مرورگرها اعمال میشود. در Node.js، میتوانید گزینه rejectUnauthorized: false
را در پیکربندی عامل HTTPS تنظیم کنید. با این حال، این کار در محیط تولید به شدت توصیه نمیشود زیرا امنیت را به خطر میاندازد. مثال: const https = require('https'); const agent = new https.Agent({rejectUnauthorized: false});
ج: برای مدیریت آپلود فایل در JavaScript مشابه پرچم -F در curl، از API 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; }