24.01.16

서린·2024년 1월 16일

혼자개발

목록 보기
19/82

open api 사용법 찾아보기

webClient를 내 프로젝트에 적용하는 과정을 정리해봐야 한다

내가 사용할 open api의 샘플 코드

/* 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/6440000/Cn100Mt/getList"); /*URL*/
        urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=서비스키"); /*Service Key*/
        urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("10", "UTF-8")); /*한 페이지당 표출 데이터 수*/
        urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지 번호*/
        urlBuilder.append("&" + URLEncoder.encode("searchNm","UTF-8") + "=" + URLEncoder.encode("", "UTF-8")); /*검색할 산 이름*/
        urlBuilder.append("&" + URLEncoder.encode("searchArea","UTF-8") + "=" + URLEncoder.encode("", "UTF-8")); /*지역코드 (기술문서참조)*/
        urlBuilder.append("&" + URLEncoder.encode("searchSeason","UTF-8") + "=" + URLEncoder.encode("", "UTF-8")); /*계절코드 (SESS1 = 봄, SESS2 = 여름, SESS3 = 가을, SESS4 = 겨울)*/
        urlBuilder.append("&" + URLEncoder.encode("searchTheme","UTF-8") + "=" + URLEncoder.encode("TEME1", "UTF-8")); /*테마코드 (기술문서참조)*/
        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());
    }
}

이 샘플 코드를 webClient를 적용한 형태로 바꿔볼건데,

  1. 의존성 추가
    dependencies를 추가한다
    implementation 'org.springframework.boot:spring-boot-starter-webflux'

  2. 인스턴스 생성
    webClient의 인스턴스 생성 방법은 두가지

  • 간단하게 바로 인스턴스 생성하는 방법
// 기본 설정으로 생성
WebClient webclient = WebClient.create();

// base url을 추가하여 생성
WebClient webclient = WebClient.create("http://localhost:8080);

  • builder를 사용하는 방법
WebClient client3 = WebClient.builder()
		.baseUrl("http://localhost:8080") 
		.defaultCookie("cookieKey", "cookieValue")
		.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) 
		.build();

builder에 들어갈 수 있는 옵션

  • uriBuilderFactory: Customized UriBuilderFactory to use as a base URL.
  • defaultUriVariables: default values to use when expanding URI templates.
  • defaultHeader: Headers for every request.
  • defaultCookie: Cookies for every request.
  • defaultRequest: Consumer to customize every request.
  • filter: Client filter for every request.
  • exchangeStrategies: HTTP message reader/writer customizations.
  • clientConnector: HTTP client library settings.
  1. 파라미터 인코딩
    webClient를 사용해서 그냥 호출하게 되면 인코딩을 하지 않아 api키가 달라지는 경우가 생길 수 있다
// uribuild 설정을 도와주는 DefaultUriBUilderFactory 호출
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(BASE_URL);

// 인코딩 모드 설정
factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);
		
WebClient webClient = WebClient.builder()
			.uriBuilderFactory(factory)
 			.baseUrl(BASE_URL)
			.build();

인코딩 모드 종류들

  • TEMPLATE_AND_VALUES: URI 템플릿을 먼저 인코딩 하고 URI 변수를 적용할 때 인코딩한다.
  • VALUES_ONLY: URI 템플릿을 인코딩하지 않고 URI 변수를 템플릿에 적용하기 전에 엄격히 인코딩한다.
  • URI_COMPONENT: URI 변수를 적용한 후에 URI 컴포넌트를 인코딩한다.
  • NONE: 인코딩을 적용하지 않는다.
  1. 응답값 요청
    소스코드를 보면서 작성해보면,
String response = webClient.get()
            .uri(uriBuilder -> uriBuilder
                .queryParam("serviceKey", serviceKey)
                .queryParam("upkind", upkind)
                .queryParam("upr_cd", upr_cd)
                .queryParam("state", state)
                .queryParam("pageNo", pageNo)
                .queryParam("NumOfRows", NumOfRows)
                .queryParam("_type", _type)
                .build())
            .retrieve()
            .bodyToMono(String.class)
            .block();
  • webClient.get() : api 문서에서 get방식을 사용한다고 되어있으니 요청방식을 get으로 해주기
  • uri(uriBuilder -> uriBuilder ...) : baseURI 및 파라미터를 지정해 주는 부분.
  • retrieve() : 응답값을 받게 해주는 메소드
  • bodyToMono(String.class) : response body를 String 타입으로 받게 해준다
  • block() : webClient는 기본적으로 비동기 방식인데 block 메소드를 이용해 동기 방식으로 바꿔준다. block을 붙여줘야 string으로 바꿀 수 있다고 한다.

0개의 댓글