วิธีการดึงข้อมูล API ด้วยการใช้ axios

ต้องบอกว่า axios เป็น HTTP Client Library ตัวนึงที่คนนิยมใช้งานมากๆ เผลอๆ จะมากกว่า Fetch API ที่เป็น global module ของ Browser ซะอีก (รวมถึงฝั่ง Node.js ที่เพิ่งจะ built-in support ใน v18.0) วันนี้เลยมาเขียนบทความการใช้งาน axios ในแบบคร่าวๆ ไว้ครับ จริงๆ เรียกว่าสรุปและอ่านจาก Docs มากกว่า 🤣
Axios คืออะไร?
axios เป็น Promise based HTTP Client Library เพื่อทำการดึงข้อมูล ส่งข้อมูล และเชื่อมต่อกับ API โดยสามารถใช้งานได้ทั้งผ่าน Browser และ Node.js ซึ่ง Features หลักๆ ที่น่าสนใจของ axios คือ:
- รองรับ Promise API
- การแปลงข้อมูล
reauest
และresponse
- รองรับการ cancel request
- ทำ Intercept headers ได้
- ป้องกัน XSRF
- รองรับ TypeScript (จริงๆ ต้องบอกว่าเป็นมาตรฐานไปแล้ว Library ไหนไม่รองรับน่าจะแปลกกว่า)
Browser Support
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
---|---|---|---|---|---|
Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 11 ✔ |
การติดตั้ง
เราสามารถใช้งาน axios ได้ทั้งผ่าน Browser หรือ Node.js ก็ได้
ติดตั้งด้วย NPM หรือ Yarn:
npm install axios# yarn add axios
หรือถ้าใช้งานผ่าน Browser ก็แทรกไปใน HTML ผ่าน CDN ได้เลย
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
ตัวอย่างการใช้งาน
ถ้าเราใช้งานแบบ CommonJS เวลา import ด้วย require()
เราจะใช้แบบด้านล่างนี้ เพื่อให้ Editor มันสามารถที่จะ support Autocomplete / Intellisense
const axios = require('axios').default
แบบ ES Module
import axios from 'axios'
GET Request
ตัวอย่างการใช้ GET
const url = 'https://your-api-server'
axios .get(url) .then((response) => { // handle success console.log(response) }) .catch((error) => { // handle errors })
ใช้งาน GET แบบส่ง Params
const url = 'https://your-api-server/users?id=12345'
axios .get(url) .then((response) => { // handle success console.log(response) }) .catch((error) => { // handle errors })
ซึ่งจะมีค่าเท่ากับแบบนี้ (เอา query params ออกจาก URL แล้วใช้ options
ส่งเป็น args ไปใน axios.get()
)
const url = 'https://your-api-server/users'
const options = { params: { id: 12345 }}
axios .get(url, options) .then((response) => { // handle success console.log(response) }) .catch((error) => { // handle errors })
async/await
เราสามารถที่จะใช้การเขียนแบบ async/await ได้ เช่นกัน
async function getUser() { try { const response = await axios.get('/your-api') console.log(response) } catch (error) { console.error(error) }}
POST Request แบบ JSON
การส่ง POST Request แบบ JSON ใช้ การส่ง payload
เป็น args ตัวที่ 2 แบบนี้
const payload = { title: 'Hello Axios' }axios.post('/posts', payload)
โดยที่ default ตัว payload จะเป็น JSON และก็ Content-Type
จะเป็น application/json
POST Request แบบ application/x-www-form-urlencoded
เราสามารถส่ง POST Request แบบ application/x-www-form-urlencoded
ได้นอกเหนือจาก JSON โดยการใช้ URLSearchParams (ตัวนี้ไม่ได้รองรับทุก Browser นะ)
const params = new URLSearchParams({ title: 'Hello Axios' })axios.post('/posts', params)
POST Request แบบ multipart/form-data
การส่งแบบ multipart/form-data
เราจะใช้ FormData ใน Browser เราสามารถเรียกใช้ FormData API ได้ ส่วนถ้าเป็น Node.js ต้องใช้ Library เพิ่มเติม เช่น form-data
const formData = new FormData()formData.append('title', 'Hello Axios')
axios.post('/posts', formData)
ถ้าเป็น Node.js จะใช้ form-data
library
const FormData = require('form-data')const form = new FormData()
axios.post('/posts', form)
Auto Serialization to FormData
ตัว Axios ก็ยังรองรับการ Serialize JSON เป็น FormData
ให้อัตโนมัติ ถ้า Content-Type
เป็น multipart/form-data
เช่น
import axios from 'axios'
axios .post( '/posts', { title: 'Hello Axios' }, { headers: { 'Content-Type': 'multipart/form-data' } } ) .then(({ data }) => console.log(data))
Method ของ Axios
นอกจากนี้ ตัว axios ยังรองรับ HTTP Method เป็นชื่อเดียวกับ function เลย ตัวอย่าง
axios.get(url)
axios.post(url, payload)
axios.put(url, payload)
axios.patch(url, payload)
axios.delete(url)
การ Custom Instance
เราสามารถ custom instance เพื่อกำหนดค่า config เองได้ เช่น กำหนด headers
หรือกำหนด baseURL
หรือ timeout
เป็นต้น
// Set config defaults when creating the instanceconst instance = axios.create({ baseURL: 'https://api.example.com', headers: { 'My-Custom-Header': 'custom-header' } timeout: 5000});
instance.defaults.headers.common['Authorization'] = 'token';
ตัวอย่างการ set token กรณีมีต้อง require token ในบาง Request แบบคร่าวๆ
const instance = axios.create()
instance.interceptors.request.use( (config) => { // get token from cookies / session / localStorage const token = getSessionToken() if (token) { config.headers['x-access-token'] = token } return config }, (error) => { return Promise.reject(error) })
การจัดการ Error
ตัว Error ที่ server ตอบกลับมาจะเข้า catch()
กรณีที่ไม่ใช่ HTTP 2xx โดยเราจะได้ response อยู่ในรูปแบบ error.response
ตัวอย่างเช่น
axios.get('/some-api').catch(function (error) { if (error.response) { // The request was made and the server responded with a status code // that falls out of the range of 2xx console.log(error.response.data) console.log(error.response.status) console.log(error.response.headers) } else if (error.request) { // The request was made but no response was received // `error.request` is an instance of XMLHttpRequest in the browser and an instance of // http.ClientRequest in node.js console.log(error.request) } else { // Something happened in setting up the request that triggered an Error console.log('Error', error.message) } console.log(error.config)})
หรือเราสามารถ ใช้ toJSON
เพื่อจัดการข้อมูลของ HTTP error ได้
axios.get('/some-api').catch(function (error) { console.log(error.toJSON())})
การ Cancel Request
เป็น feature ที่ค่อนข้างมีประโยชน์ กรณีที่เราทำการเรียก request ไปแล้ว และอยากยกเลิกมัน ก็สามารถทำได้ผ่านตัว AbortController
const controller = new AbortController()
axios .get('/path/to/api', { signal: controller.signal }) .then(function (response) { //... })// cancel the requestcontroller.abort()
Credentials
Request ที่ยุ่งกับ cookies และ cross-site Access-Control
เราสามารถใช้ withCredentials
ได้ ตัวอย่าง
import axios from 'axios';
const instance = axios.create({ withCredentials: true});
instance.get('/todos');
# หรือaxios.post('/login', { email, password }, { withCredentials: true });
ทั้งหมดนี้ก็เป็นการใช้งาน axios แบบคร่าวๆ ซึ่งจริงๆ ก็ไม่มีอะไรมาก การ custom อื่นๆ หรือการประยุกต์ใช้งานในรายละเอียดอื่นๆ สามารถอ่านเพิ่มเติมได้ที่ Docs ของ axios ได้เลยครับ
Happy Coding ❤️
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust