Μετατρέψτε εντολές 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 ακολουθεί αυτόματα τις ανακατευθύνσεις και δεν στέλνει cookies από προεπιλογή, ενώ το curl κάνει και τα δύο εκτός αν ρυθμιστεί διαφορετικά.
Α: Το Fetch είναι ενσωματωμένο στα σύγχρονα προγράμματα περιήγησης αλλά απαιτεί περισσότερο πρότυπο κώδικα για το χειρισμό σφαλμάτων και δεν αναλύει αυτόματα τις αποκρίσεις JSON. Το Axios είναι μια βιβλιοθήκη που παρέχει ένα πιο πλούσιο σε χαρακτηριστικά API με αυτόματη ανάλυση JSON, καλύτερο χειρισμό σφαλμάτων, παρεμβολή αιτήματος/απόκρισης και ενσωματωμένη ακύρωση αιτήματος. Το Axios λειτουργεί επίσης με συνέπεια σε περιβάλλοντα προγραμμάτων περιήγησης και Node.js.
Α: Οι περιορισμοί CORS (Cross-Origin Resource Sharing) ισχύουν για 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.
Α: Με το API fetch, χρησιμοποιήστε 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 παρέχει διαφορετικά εργαλεία αποσφαλμάτωσης. Στα προγράμματα περιήγησης, χρησιμοποιήστε την καρτέλα Δίκτυο στα 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; }