Axios 是一個基於 Promise 的 HTTP 客戶端,可以用在瀏覽器和 Node.js 中,可以用在前端和後端,可以用來發送 HTTP 請求。
先安裝 Axios:
$ npm install axios
接下來在專案的 app 資料夾下新增一個 lib 資料夾,並且在其底下再新增一個 api 資料夾。之後 lib 資料夾還可以放一些其他自定義的設定,例如 custom hook 等等。
$ mkdir app/lib && mkdir app/lib/api
然後在 api 資料夾下新增 2 個檔案:
$ touch app/lib/api/client.ts app/lib/api/endpoints.ts
client.ts 是用來設定 Axios 的設定,endpoints.ts 是用來設定 API 的路徑。
首先在 client.ts 中加入以下程式碼:
import axios, { AxiosInstance } from 'axios'
interface GetParams {
[key: string]: string | number | boolean
}
class APIClient {
client: AxiosInstance
constructor() {
this.client = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_URL,
responseType: 'blob',
headers: {
'Content-Type': 'application/json'
}
})
}
get(path: string, params?: GetParams) {
return this.client.get(path, { params })
}
}
export type { GetParams }
export default APIClient
這裡我們使用 axios.create 來建立一個 Axios 的實例,並且設定一些基本的設定,例如 baseURL、responseType、headers 等等。
並且加上一個 get 的方法,這個方法是用來發送 GET 請求的,參數的部分我們使用 params 來傳遞,這樣子就可以把參數轉換成 query string。
而且 params 可以傳遞不同的型別,例如 string、number、boolean 等等,這裡我們使用 GetParams 來定義這個型別。
接下來在 endpoints.ts 中加入以下程式碼:
const Endpoints = {
GenerateQrcode: {
pngType: 'generate_qr'
}
}
export default Endpoints
這裡我們使用物件來管理 API 的路徑,之後要新增或是編輯 API 的路徑的話,就可以直接在這裡修改。
最後一個設定就是要把 Generate Qrcode 的 API 統一放到一個檔案中做使用,所以我們在 api 資料夾下新增一個 generateQrcode.ts 檔案,並且加入以下程式碼:
import APIClient, { GetParams } from './client'
import Endpoints from './endpoints'
const apiClient = new APIClient()
interface QrCodeParams {
url?: string
phone?: string
email?: string
address?: string
}
const generateQrcode = {
getPng: (params: QrCodeParams) => {
return apiClient.get(Endpoints.GenerateQrcode.pngType, params as GetParams)
}
}
export default generateQrcode
這裡我們使用 apiClient 來發送請求,並且使用 Endpoints.GenerateQrcode.pngType 來取得 API 的路徑,最後再把參數傳遞進去。之後也會在這裡新增 POST 新增 QR Code SVG 的 API。
完成以上的設定後,就可以把原本的 fetch 改成 axios 來發送請求了。
首先在 page.tsx 中引入 generateQrcode:
const [imgSrc, setImgSrc] = useState<string | null>(null)
useEffect(() => {
const fetchQrCodeImage = async () => {
try {
const params = { url: 'https://buckychu.im' }
const response = await generateQrcode.getPng(params)
const blob = new Blob([response.data], { type: 'image/png' })
const objectURL = URL.createObjectURL(blob)
setImgSrc(objectURL)
} catch (_) {
console.error('Error fetching image:')
}
}
fetchQrCodeImage()
return () => {
setImgSrc(null)
}
}, [])
看起來運作正常,很棒👍!
這篇文章介紹了如何使用 Axios 來管理 API,雖然目前的專案只有一個 API,但是如果專案越來越大的話,使用 Axios 來管理 API 會變得更加方便,明天來接另一支 API,明天見👋!