
2015년부터 주요 브라우저에서는 fetch를 제공했고 ky는 fetch 기반 라이브러리 중 하나 입니다.
공식문서
모두 HTTP 요청을 보내고 응답을 처리하는 데 사용되는 자바스크립트 라이브러리입니다.
장점
단점
AbortController 사용하여 직접 구현해야 합니다.fetch는 HTTP 오류 상태 코드(404, 500 등)를 자동으로 throw 하지 않습니다. 대신 response.ok 속성을 확인하여 요청 성공 여부를 확인해야 한다.장점
CancelToken을 통한 취소 기능을 지원합니다단점
npm install axios yarn add axiosnpm install ky
or
yarn add ky
import ky from "ky";
const json = await ky.post("https://example.com", { json: { foo: true } }).json();
console.log(json);
//=> `{data: '🦄'}`
class HTTPError extends Error {}
const response = await fetch("https://example.com", {
method: "POST",
body: JSON.stringify({ foo: true }),
headers: {
"content-type": "application/json",
},
});
if (!response.ok) {
throw new HTTPError(`Fetch error: ${response.statusText}`);
}
const json = await response.json();
console.log(json);
//=> `{data: '🦄'}`
// ky 예시
import ky from "ky";
ky.get("https://api.example.com/data", { timeout: 5000 }) // 5초 타임아웃
.then((data) => console.log(data))
.catch((error) => console.error(error));
import ky from 'ky';
const response = await ky('https://example.com/api/users', {
hooks: {
beforeRequest: [
(request) => {
// 요청 전에 헤더 추가
request.headers.set("Authorization", "Bearer token");
},
],
afterResponse: [
(_request, _options, response) => {
console.log(response);
// Or return a `Response` instance to overwrite the response.
return new Response('A different response', {status: 200});
},
// Or retry with a fresh token on a 403 error
async (request, options, response) => {
if (response.status === 403) {
// Get a fresh token
const token = await ky('https://example.com/token').text();
// Retry with the token
request.headers.set('Authorization', `token ${token}`);
return ky(request);
}
}
]
}
});
ky.create()과는 다르게 ky.extend()는 부모로 부터 상속 받아 재설정 합니다.
import ky from 'ky';
const url = 'https://sindresorhus.com';
const original = ky.create({
headers: {
rainbow: 'rainbow',
unicorn: 'unicorn'
},
hooks: {
beforeRequest: [ () => console.log('before 1') ],
afterResponse: [ () => console.log('after 1') ],
},
});
const extended = original.extend({
headers: {
rainbow: undefined
},
hooks: {
beforeRequest: undefined,
afterResponse: [ () => console.log('after 2') ],
}
});
const response = await extended(url).json();
//=> after 1
//=> after 2
console.log('rainbow' in response);
//=> false
console.log('unicorn' in response);
//=> true
ky는 FormData와 같은 데이터를 보다 쉽게 전송할 수 있게 도와줍니다. fetch에서 FormData를 직접 전송하려면 수동으로 body를 설정해야 하지만, ky에서는 이 작업을 훨씬 간단하게 처리할 수 있습니다.
파일 업로드나 폼 데이터 전송을 다룰 때 Content-Type을 자동으로 처리해 줍니다.
import ky from "ky";
// `multipart/form-data`
const formData = new FormData();
formData.append("food", "fries");
formData.append("drink", "icetea");
const response = await ky.post("https://api.example.com/upload", { body: formData });
fetch는 재시도 기능을 제공하지 않지만, ky는 실패한 요청에 대해 자동으로 재시도할 수 있는 기능을 제공하며, 이 기능은 여러 번의 시도를 설정할 수 있도록 합니다.
import ky from "ky";
const json = await ky("https://example.com", {
retry: {
limit: 10, // 최대 3번 재시도
methods: ["get"], // GET 요청에서 재시도
statusCodes: [413], // 특정 상태 코드(예: 서버 오류)에서만 재시도
backoffLimit: 3000, // 재시도 간격
},
}).json();
import axios from "axios";
axios
.get("https://api.example.com/data")
.then((response) => {
console.log(response.data);
})
.catch((error) => {
if (error.response) {
// 서버가 2xx 범위를 벗어나는 상태 코드로 응답한 경우
console.error("Server responded with an error:", error.response.status);
console.error("Response data:", error.response.data);
} else if (error.request) {
// 요청이 전송되었지만 응답을 받지 못한 경우
console.error("No response received:", error.request);
} else {
// 요청 설정 중에 오류가 발생한 경우
console.error("Error setting up the request:", error.message);
}
console.error("Error config:", error.config);
});
axios의 에러 객체는 다음과 같은 속성을 포함합니다:
error.response: 서버 응답이 있는 경우 (상태 코드가 2xx 범위 밖)error.request: 요청은 전송되었지만 응답이 없는 경우error.message: 요청 설정 중 오류가 발생한 경우 에러 메세지error.config: 요청 설정 정보import ky from "ky";
ky.get("https://api.example.com/data")
.json()
.then((data) => {
console.log(data);
})
.catch((error) => {
if (error instanceof ky.HTTPError) {
// HTTP 에러 (4xx, 5xx 상태 코드)
console.error("HTTP Error Response:", error.response);
error.response.text().then((text) => {
console.error("Error response text:", text);
});
} else {
// 네트워크 오류 등 다른 종류의 에러
console.error("An error occurred:", error.message);
}
});
ky의 에러 처리 특징:
HTTPError 인스턴스를 통해 HTTP 에러를 처리합니다.error.response를 통해 응답 객체에 접근할 수 있습니다.error.response.text() 또는 error.response.json()).