스크롤 내리면 미리보기를 할 수 있다.
여기서 서비스 키 부분에 위 인증키를 넣은 후 미리보기를 누르면 볼 수 있다.
/* 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를 사용해서 진행한다.
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '2.7.5'
@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
@RequiredArgsConstructor
@RequestMapping("/weather")
public class WeatherController {
private final WeatherApiService weatherApiService;
@GetMapping("/weathers")
public String getWeather(){
return weatherApiService.getApi();
}
}
컨트롤러 부분이다. 위 서비스에서 요청을 통해 얻은 값을 화면에 뿌려준다.