#reactjs #axios
Вопрос:
Я новичок в Axios и React, я создаю приложение React, которое выполняет операции CRUD с использованием Axios для извлечения данных из API.
В указанной api/agent.ts
мной конфигурации Axios для моего API, который я разработал.
api/agent.ts
import axios, { AxiosError, AxiosResponse } from "axios"
// my API url
axios.defaults.baseURL = "http://localhost:8800/api"
// api response
const responseBody = <T>(response: AxiosResponse<T>) => response.data
const requests = {
get: <T>(url: string) => axios.get<T>(url).then(responseBody),
post: <T>(url: string, body: {}) =>
axios.post<T>(url, body).then(responseBody),
put: <T>(url: string, body: {}) =>
axios.put<T>(url, body).then(responseBody),
del: <T>(url: string) => axios.delete<T>(url).then(responseBody),
}
// other API requests...
Теперь в некоторых компонентах я хочу использовать Axios для отправки запроса от других служб, а не от той axios.defaults.baseURL
, в которой я настроен api/agent.ts
, например, я хочу сделать запрос из my dummyData.json
в public
папке
public/dummyData/dummy_data.json
{
"message": "data fetched successfully",
"data": [{
"id": "manga-jo986949",
"thumbnail_url": "https://avt.mkklcdnv6temp.com/27/p/22-1602825472.jpg",
"title": "Memorize",
"latest_chapter_title": "Chapter 69",
"latest_chapter": 69,
"latest_chapter_url": "https://readmanganato.com/manga-jo986949/chapter-69",
"views_count": 39037474,
"authors": ["Jeongha", "Ro Yujin"],
"last_updated": "Oct-31-2021 14:32",
"url": "https://readmanganato.com/manga-jo986949"
},
{
"id": "manga-uj971844",
"thumbnail_url": "https://avt.mkklcdnv6temp.com/3/c/14-1583489799.jpg",
"title": "Vampire Knight Memories",
"latest_chapter_title": "Chapter 33",
"latest_chapter": 33,
"latest_chapter_url": "https://readmanganato.com/manga-uj971844/chapter-33",
"views_count": 1853526,
"authors": ["ji", "tom"],
"last_updated": "Jul-10-2021 03:33",
"url": "https://readmanganato.com/manga-uj971844"
}
]
}
Это компоненты, которые я использовал для извлечения и отображения dummy_data.json
fetcher.tsx
import axios from "axios"
export async function get<T>(path: string): Promise<T> {
const { data } = await axios.get(path)
return data
}
mangaList.tsx
import React, { useEffect, useState } from "react"
import { get } from "../fetcher"
export default function MangaList() {
const [data, setData] = useState<Manga[]>([])
const getData = async () => {
try {
const result = await get<Manga[]>("/dummy_data.json")
setData(result)
} catch (err) {
throw err
}
console.log("manga data: ", data)
}
useEffect(() => {
getData()
}, [])
return (
<div>
<h2>Welcome to Manga Online</h2>
// some code ...
</div>
)
}
Когда я перенаправляю на /MangaList
, консоль сообщает об этом GET http://localhost:8800/api/dummy_data.json 404 (Not Found)
. Axios все еще используется axios.defaults.baseURL
для извлечения нерелевантных данных.
Ответ №1:
Вы используете axios defaultUrl
. Но в вашем случае лучше использовать экземпляр axios, а не обновлять axios default
параметры.
Вот как мы можем создать экземпляр axios.
// axios instance 1
import axios from 'axios'
const axiosInstanceRemote = axios.create({
baseUrl: "http://localhost:8800/api"
)}
и ваш запрос выглядит так:
const requests = {
get: <T>(url: string) => axiosInstanceRemote .get<T>(url).then(responseBody),
post: <T>(url: string, body: {}) =>
axiosInstanceRemote .post<T>(url, body).then(responseBody),
...similar
}
Здесь вы используете конкретный экземпляр, а не значения по умолчанию axios.
И для вашего локального вызова api:
// fetch.jsx
import axios from "axios"
export async function get<T>(path: string): Promise<T> {
const { data } = await axios.get(path)
return data
}
вы можете либо создать другой экземпляр (аналогичный экземпляру 1 с другим базовым URL), либо использовать запрос axios по умолчанию.
Вот официальный документ.
Ответ №2:
Из документов axios у вас есть baseUrl и url
baseURL
будет добавляться к url
при выполнении запросов. Таким образом, вы можете определить baseURL
as http://127.0.0.1:8800
и отправлять свои запросы в /url
// `url` is the server URL that will be used for the request url: '/user', // `baseURL` will be prepended to `url` unless `url` is absolute. // It can be convenient to set `baseURL` for an instance of axios to pass relative URLs // to methods of that instance. baseURL: 'https://some-domain.com/api/',