open-APi

김하은·2023년 2월 2일
0
post-custom-banner

open-APi를 사용하려고 이번에는 한국것을 사용해보려 검색하고 돌아봤다.

공공데이터포털에서 관광지 날씨등을 받아오려했더니 문제가 생겼다.
CORS에러인줄 알았는데 나중에 다른것을 하다보니 깨달았다...
뭔가를 잘못적은거였다.

다른 open-API를 찾아보았다.

rapidapi
라는 사이트였다.

국가의 날씨를 받아오는것이었고, 코드도 잘 나와있어서 사용하기 수월한듯 보여 적용을 했다.

데이터를 뿌리는 과정에서 좀 해매긴 했지만... 어쨌든 불러는 왔다.

이제 정리만하면 된다.

해당코드

/* Javascript 샘플 코드 */
import axios from "axios";
import { useEffect, useState } from "react";
import * as S from "./openAPI.styles";
export default function OpenAPI(): JSX.Element {
  const [today, setToday] = useState("");
  const [todayW, setTodayW] = useState("");
  const [conditionIcon, setConditionIcon] = useState("");
  const [forecastIcon, setForecastIcon] = useState([]);
  useEffect(() => {
    const options = {
      method: "GET",
      // url: "https://weatherapi-com.p.rapidapi.com/current.json",
      url: "https://weatherapi-com.p.rapidapi.com/forecast.json",
      // params: { q: "South Korea" },// 오늘날씨만 받아오기
      params: { q: "South Korea", days: "3" },
      headers: {
        "X-RapidAPI-Key": "bcaa27cb8amsha0c78dedd13b245p1e6b34jsn749e0be3decd",
        "X-RapidAPI-Host": "weatherapi-com.p.rapidapi.com",
      },
    };

    axios
      .request(options)
      .then(function (response) {
        console.log(response.data.forecast.forecastday[0].day.condition.text);
      setForecastIcon(response.data.forecast.forecastday);
        // response.data.forecastday.map((el)=>(
        //   el.day.condition.icon
        // ))
        // console.log(response.data);
        setTodayW(response.data.current.condition.text); // 오늘의 날씨 영어
       setConditionIcon(response.data.current.condition.icon); // 오늘의 날씨 아이콘
        setToday(response.data.location.localtime.slice(0, 10)); // 날짜
      })
      .catch(function (error) {
        console.error(error);
      });
  }, []);

  return (
    <>
      <S.TodayWeatherWrap>
        <S.WeatherTitle>오늘의 날씨</S.WeatherTitle>
        <S.WeatherImg src={conditionIcon} />
        <div>
          <S.WhatWeather>{todayW}</S.WhatWeather>
          <span>{today}</span>
        </div>
        {forecastIcon.map((el: any) => (
          // 앞으로의 날씨 3일
          <img src={el.day.condition.icon} key={el} />
        ))}
      </S.TodayWeatherWrap>
    </>
  );
}

랜더링시 한번만 실행되게 useEffect로 묶었는데 일단 안묶으면 어떻게되는지 한번 해봐야겠다.

post-custom-banner

0개의 댓글