[2] 나만의 블로그 만들기

김준영·2022년 11월 3일
1

Open API 데이터 받아오기

1. 활용 신청

  • 우선 공공데이터 포털에가서 로그인 및 데이터 활용 신청을 한다.
  • 활용 신청 후 마이페이지 -> Open API -> 개발계정에 들어가면 위 사진처럼 나온다.
  • 아래 사진에서 인증키(Encoding, Decoding)는 API요청 할때같이 파라미터로 보낸다. 둘 중 하나 되는거 사용하면 됨.

스크롤 내리면 미리보기를 할 수 있다.
여기서 서비스 키 부분에 위 인증키를 넣은 후 미리보기를 누르면 볼 수 있다.

2. Request & Response

샘플 코드

/* Java 1.8 샘플 코드 */


import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.io.BufferedReader;
import java.io.IOException;

public class ApiExplorer {
    public static void main(String[] args) throws IOException {
        StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst"); /*URL*/
        urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=서비스키"); /*Service Key*/
        urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
        urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("1000", "UTF-8")); /*한 페이지 결과 수*/
        urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode("XML", "UTF-8")); /*요청자료형식(XML/JSON) Default: XML*/
        urlBuilder.append("&" + URLEncoder.encode("base_date","UTF-8") + "=" + URLEncoder.encode("20210628", "UTF-8")); /*‘21년 6월 28일발표*/
        urlBuilder.append("&" + URLEncoder.encode("base_time","UTF-8") + "=" + URLEncoder.encode("0500", "UTF-8")); /*05시 발표*/
        urlBuilder.append("&" + URLEncoder.encode("nx","UTF-8") + "=" + URLEncoder.encode("55", "UTF-8")); /*예보지점의 X 좌표값*/
        urlBuilder.append("&" + URLEncoder.encode("ny","UTF-8") + "=" + URLEncoder.encode("127", "UTF-8")); /*예보지점의 Y 좌표값*/
        URL url = new URL(urlBuilder.toString());
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-type", "application/json");
        System.out.println("Response code: " + conn.getResponseCode());
        BufferedReader rd;
        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
        rd.close();
        conn.disconnect();
        System.out.println(sb.toString());
    }
}

위 코드는 오픈 API 상세 기능에서 볼 수 있는 샘플 코드이다.

위 코드대로 사용해도 되지만 Webclient를 사용해서 진행한다.

WebClient

implementation group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '2.7.5'
  • build.gradle -> dependencies에 추가.
@Value("${weather-apikey}")
    String serviceKey;
    String BASE_URL = "http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst";
    String pageNo = "1";
    String numOfRows = "1000";
    String dataType = "JSON";
    String base_date = "20221103";
    String base_time = "0500";
    String nx = "55";
    String ny = "127";
  • 인증키는 properties파일에 작성하여 @Value로 값을 가져온다. (외부 노출을 막기 위함)

  • 파라미터값을 변수에 넣어준다.
    (기본 dataType은 xml이고 난 JSON사용)

DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(BASE_URL);
factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);
WebClient webClient = WebClient.builder().uriBuilderFactory(factory).baseUrl(BASE_URL).build();

참조 : https://wpioneer.tistory.com/222

WebClient를 사용해서 그냥 호출하게 되면 인코딩을 하지 않아 API 키가 달라지는 경우가 생긴다고 한다. 그래서 위 인코딩 작업을 해줌.

혹시 몰라 EncodingMode를 NONE으로 해보았지만 정상적으로 호출됨. 알아두면 좋을 듯

자세한 설명은 링크에 가면 잘 나와있음.

return webClient.get()
                .uri(uriBuilder -> uriBuilder
                        .queryParam("serviceKey", serviceKey)
                        .queryParam("pageNo", pageNo)
                        .queryParam("numOfRows", numOfRows)
                        .queryParam("dataType", dataType)
                        .queryParam("base_date", base_date)
                        .queryParam("base_time", base_time)
                        .queryParam("nx", nx)
                        .queryParam("ny", ny)
                        .build())
                .retrieve()
                .bodyToMono(String.class)
                .block();

get()으로 GET요청을 하고 uriBuilder를 통해 요청 파라미터도 넣어준다.
String.class로 받아 화면에 뿌려준다.

RestController

@RestController
@RequiredArgsConstructor
@RequestMapping("/weather")
public class WeatherController {
    private final WeatherApiService weatherApiService;

    @GetMapping("/weathers")
    public String getWeather(){
        return weatherApiService.getApi();
    }
}

컨트롤러 부분이다. 위 서비스에서 요청을 통해 얻은 값을 화면에 뿌려준다.

결과

profile
ㅎㅎ

0개의 댓글