반응형
axios 라이브러리를 사용한 api 통신
1. api란?
- api는 application programming interface의 약자로, 프로그램과 프로그램 사이의 통신을 위한 규약이다.
- api는 서버와 클라이언트 사이에서 데이터를 주고 받는 방식을 의미한다.
2. axios 라이브러리를 사용한 api 통신
axios는 API 요청을 보내는 라이브러리
- Axios는 JavaScript에서 사용되는 유명한 HTTP 클라이언트 라이브러리로
- 웹 브라우저와 Node.js 환경에서 사용될 수 있으며, HTTP 요청을 보내고 받는 기능을 제공합니다.
- Axios는 Promise 기반의 API를 사용하여 비동기 HTTP 요청을 간편하게 처리할 수 있게 해줍니다.
- Axios 설치
npm install axios
yarn add axios
- Axios 문법 구성
Promise를 사용한 코드
import axios from 'axios';
function fetchData() {
// API 요청을 보내는 함수 (async : 비동기 함수)
axios // axios 라이브러리를 사용하여 API 요청을 보냄
.get('https://api.example.com/data') // get 메서드를 사용하여 데이터를 가져옴
.then((response) => {
// then 메서드를 사용하여 응답 데이터를 출력
console.log('데이터:', response.data);
})
.catch((error) => {
// catch 메서드를 사용하여 예외 처리
console.error('에러:', error);
});
}
fetchData(); // 함수 호출
async/await를 사용한 코드
import axios from 'axios';
async function fetchData() {
// API 요청을 보내는 함수 (async : 비동기 함수)
try {
// try 블록 안에서 예외가 발생하면 catch 블록이 실행된다.
const response = await axios.get('https://api.example.com/data'); // get 메서드를 사용하여 데이터를 가져옴
console.log('데이터:', response.data);
} catch (error) {
// catch 메서드를 사용하여 예외 처리
console.error('에러:', error);
}
}
// fetchData 함수를 호출
fetchData();
- 기본 문법 예제
// SimpleApiExample.js
// useEffect 추가 : 컴포넌트가 렌더링 될 때마다 특정 작업을 수행할 수 있도록 설정하는 Hook이다.
import React, { useState, useEffect } from 'react';
import axios from 'axios'; // axios 추가 : API 요청을 보내는 라이브러리
function SimpleApiExample() {
// 데이터를 저장할 상태를 정의한다.
// 초기값: null, data : API 요청 결과, setData : API 요청 결과를 저장하는 함수
const [data, setData] = useState(null);
// API 요청을 보내는 함수
useEffect(() => {
// API 요청을 보내는 함수 (async : 비동기 함수)
async function fetchData() {
// try 블록 안에서 예외가 발생하면 catch 블록이 실행된다.
try {
const response = await axios.get('https://jsonplaceholder.typicode.com/posts/1');
// 응답 데이터를 상태에 저장
setData(response.data);
} catch (error) {
// 예외 발생 시
console.error('Error fetching data', error); // 에러 메시지 출력
}
}
fetchData(); // API 요청 함수 호출
}, []);
// 데이터 로딩 중이거나 없을 때의 처리
if (!data) return <div>Loading...</div>;
return (
// API 요청 결과 출력
<div>
<h1>{data.title}</h1>
<p>{data.body}</p>
</div>
);
}
export default SimpleApiExample;
- NFT API 예제
https://jsonplaceholder.typicode.com/photos?_limit=10
[
{
"albumId": 1,
"id": 1,
"title": "accusamus beatae ad facilis cum similique qui sunt",
"url": "https://via.placeholder.com/600/92c952",
"thumbnailUrl": "https://via.placeholder.com/150/92c952"
},
{
"albumId": 1,
"id": 2,
"title": "reprehenderit est deserunt velit ipsam",
"url": "https://via.placeholder.com/600/771796",
"thumbnailUrl": "https://via.placeholder.com/150/771796"
},
{
"albumId": 1,
"id": 3,
"title": "officia porro iure quia iusto qui ipsa ut modi",
"url": "https://via.placeholder.com/600/24f355",
"thumbnailUrl": "https://via.placeholder.com/150/24f355"
},
...생략...
]
// NFTCollection.js
import React, { useState, useEffect } from 'react';
import axios from 'axios'; // axios 라이브러리 : API 요청을 보내는 라이브러리
import NFT from './NFT'; // NFT 컴포넌트 파일 임포트
function App() {
const [nfts, setNfts] = useState([]); // 여러 NFT 데이터를 저장할 배열 상태
useEffect(() => {
// 컴포넌트가 렌더링 될 때마다 특정 작업을 수행할 수 있도록 설정하는 Hook
async function fetchNFTs() {
try {
// 여러 NFT 데이터를 가져옴
const response = await axios.get('https://jsonplaceholder.typicode.com/photos?_limit=10');
// 가져온 데이터를 원하는 형태로 가공
const nftData = response.data.map((nft) => ({
image: nft.url,
name: nft.title,
author: 'Demo Author',
bidders: ['bidder1.jpg', 'bidder2.jpg', 'bidder3.jpg'],
currentbid: '$5000',
download: nft.thumbnailUrl,
}));
setNfts(nftData); // 가져온 데이터로 상태 업데이트
} catch (error) {
console.error('Error fetching NFT data', error);
}
}
fetchNFTs();
}, []);
return (
<div>
{nfts.map((nft, index) => (
<NFT key={index} {...nft} /> // 각 NFT 데이터에 대한 컴포넌트 생성
))}
</div>
);
}
export default App;
// NFT.js
import React, { useState } from 'react';
import { Box, Flex, Image, Text, Button, Icon, AvatarGroup, Avatar, Link } from '@chakra-ui/react';
import { IoHeart, IoHeartOutline } from 'react-icons/io5';
function NFT({ image, name, author, bidders, currentbid, download }) {
const [like, setLike] = useState(false);
return (
<Box p="20px" boxShadow="0px 0px 2px 1px rgba(0,0,0,0.2)" borderRadius="20px">
<Flex direction="column" justify="center">
<Box mb="20px" position="relative">
<Image src={image} width="100%" height="auto" borderRadius="20px" />
<Button
position="absolute"
bg="white"
_hover={{ bg: 'whiteAlpha.900' }}
_active={{ bg: 'white' }}
_focus={{ bg: 'white' }}
top="14px"
right="14px"
borderRadius="50%"
minW="36px"
h="36px"
onClick={() => setLike(!like)}
>
<Icon w="20px" h="20px" as={like ? IoHeart : IoHeartOutline} color="brand.500" />
</Button>
</Box>
<Flex flexDirection="column" justify="space-between">
<Flex justify="space-between" mb="auto">
<Flex direction="column">
<Text fontSize="xl" mb="5px" fontWeight="bold">
{name}
</Text>
<Text color="gray.600" fontSize="sm">
{author}
</Text>
</Flex>
<AvatarGroup max={3} size="sm" fontSize="12px">
{bidders.map((avt, key) => (
<Avatar key={key} src={avt} />
))}
</AvatarGroup>
</Flex>
<Flex align="start" justify="space-between" mt="25px">
<Text fontWeight="700" fontSize="sm">
Current Bid: {currentbid}
</Text>
<Link href={download}>
<Button
variant="outline"
colorScheme="blue"
fontSize="sm"
fontWeight="500"
borderRadius="70px"
px="24px"
py="5px"
>
Place Bid
</Button>
</Link>
</Flex>
</Flex>
</Flex>
</Box>
);
}
export default NFT;
반응형
'Front > React' 카테고리의 다른 글
React 카운터 앱 만들기 - component, useState (1) | 2024.03.04 |
---|---|
React(리액트) 기본 기능 정리 (0) | 2024.02.29 |
React GitHub 배포, Netlify 배포 (0) | 2023.11.13 |
React Library (0) | 2023.11.06 |
Framer Motion - 리액트 라이브러리, 애니메이션 구현 (0) | 2023.11.04 |