고래씌
[Open API] 1-1. 대기오염정보 공공데이터를 이용한 실습 본문
1. 대기오염정보 공공데이터를 이용한 실습
=> 우리는 이 데이터를 이용하여 실습할 예정이다.
=> 활용신청 클릭하여 활용신청하기
1) 마이페이지 들어가서 개인 API에 있는 인증키 복사 클릭(Encoding)
=> 인증키는 앞으로 많이 사용할 예정이다!
=> 대기질 예보통보 조회를 볼경우 저 getMinDustFrcstDspth로 요청을 보내야하고 목록마다 다 요청주소가 다르다!
=> 우선 url로 요청한다!
=> 요청주소를 복사하여 ?serviceKey=인증키 를 치면 데이터를 불러오는 것을 확인할 수 있다
=> 이것은 브라우저상에서 요청을 보내는 방법이라서 우리는 자바로 보내도록 할 것이다
=> 뒤에 ?retunrType=json 을 붙이면 JSON형식으로 받을 수 있다.
=> index.jsp 파일 생성
▶ index.jsp
- EL 표현식을 사용하지 않을 것이기 때문에 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<h2>실시간 대기오염정보</h2>
지역 :
<select id="location">
<option>서울</option>
<option>부산</option>
<option>대전</option>
<option>대구</option>
<option>경기</option>
</select>
<button id="btn1">실시간 대기오염정보 확인</button>
<button id="btn2">실시간 대기오염정보 확인(xml방식)</button>
<table id="result1" border="1" align="center">
<thead>
<tr>
<th>측정소명</th>
<th>측정시간</th>
<th>통합대기환경수치</th>
<th>미세먼지농도</th>
<th>일산화탄소농도</th>
<th>이산화질소농도</th>
<th>아황산가스농도</th>
<th>오존농도</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</body>
</html>
- AirVo.java class 파일 생성
▶ AirVo.java
=> 여기에 출력결과에 나오는 키값이 모두 일치해야한다!!
package com.kh.opendata.model.vo;
public class AirVo {
private String stationName; // 측정소명
private String dataTime; // 측정일시
private String khaiValue; // 통합대기환경수치
private String pm10Value; // 미세먼지(10pm) 농도
private String so2Value; // 아황산가스 농도
private String coValue; // 일산화탄소 농도
private String no2Value; // 이산화질소 농도
private String o3Value; // 오존 농도
public AirVo() {
}
public AirVo(String stationName, String dataTime, String khaiValue, String pm10Value, String so2Value,
String coValue, String no2Value, String o3Value) {
super();
this.stationName = stationName;
this.dataTime = dataTime;
this.khaiValue = khaiValue;
this.pm10Value = pm10Value;
this.so2Value = so2Value;
this.coValue = coValue;
this.no2Value = no2Value;
this.o3Value = o3Value;
}
public String getStationName() {
return stationName;
}
public void setStationName(String stationName) {
this.stationName = stationName;
}
public String getDataTime() {
return dataTime;
}
public void setDataTime(String dataTime) {
this.dataTime = dataTime;
}
public String getKhaiValue() {
return khaiValue;
}
public void setKhaiValue(String khaiValue) {
this.khaiValue = khaiValue;
}
public String getPm10Value() {
return pm10Value;
}
public void setPm10Value(String pm10Value) {
this.pm10Value = pm10Value;
}
public String getSo2Value() {
return so2Value;
}
public void setSo2Value(String so2Value) {
this.so2Value = so2Value;
}
public String getCoValue() {
return coValue;
}
public void setCoValue(String coValue) {
this.coValue = coValue;
}
public String getNo2Value() {
return no2Value;
}
public void setNo2Value(String no2Value) {
this.no2Value = no2Value;
}
public String getO3Value() {
return o3Value;
}
public void setO3Value(String o3Value) {
this.o3Value = o3Value;
}
@Override
public String toString() {
return "AirVo [stationName=" + stationName + ", dataTime=" + dataTime + ", khaiValue=" + khaiValue
+ ", pm10Value=" + pm10Value + ", so2Value=" + so2Value + ", coValue=" + coValue + ", no2Value="
+ no2Value + ", o3Value=" + o3Value + "]";
}
}
- AirPollutionTest.java 파일 생성
▶ AirPollutionTest.java
=> serviceKey와 sidoName이 필수로 들어가야하기 때문에 추가해야한다!
package com.kh.opendata.model.run;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import org.junit.Test;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.kh.opendata.model.vo.AirVo;
public class AirPollutionTest {
// 한국환경공단_에어코리아_대기오염정보중 시도정보
public static final String serviceKey = "인증키"; // 본인의 인증키 복붙
public String[] locations = {"전국","서울","부산","대구","인천","광주","대전","울산","경기","강원","충북",
"충남","전북","전남","경북","경남","제주","세종"};
@Test // 이것을 사용하면 테스트 해볼 수 있다!
public void locationTestRun() throws IOException{
for(String location : locations) {
testRun(location); // 각 지역별로 요청을 보냄
}
}
public void testRun(String location) throws IOException{
// OPENAPI서버로 요청할 URL주소 설정
// 요청주소 복사하여 붙여놓기
String url = "http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty";
url += "?serviceKey="+ serviceKey;
url += "&sidoName="+ URLEncoder.encode(location, "UTF-8"); // 이게 url상에서는 깨져서 url방식으로 인코딩해주어야한다.
url += "&returnType=json"; // JSON 형식으로 받고싶다면
url += "&numOfRows=50"; // 반환받는 결과값 개수
// URL 객체정보
// 1. 요청하고자하는 url주소를 매개변수로 전달하면서 URL 객체 생성
URL requestUrl = new URL(url);
// 2. 생성된 URL을 통해 httpUrlConnection객체 생성
HttpURLConnection urlConnection = (HttpURLConnection) requestUrl.openConnection();
// 3. 전송방식설정 // 자바에서 직접 요청을 보낼경우 header정보를 직접설정해서 보내야함!
urlConnection.setRequestMethod("GET");
// 4. 요청주소에 적힌 openAPI서버로 요청 보내기
// 값을 얻을수있는 stream을 새로 얻어옴
BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); // 읽기, 출력 향상 목적으로 만들어진 보조스트림
String responseText = "";
String line;
while((line = br.readLine()) != null) {
System.out.println(line); // 현재 입력받은 line값 출력
responseText += line;
}
// System.out.println(responseText);
// responseText에서 원하는 데이터만 추출하여 vo클래스로 전환
// responseText에서 원하는 데이터만 추출해서 json으로 담아주는 코드
JsonObject totalObj = JsonParser.parseString(responseText).getAsJsonObject(); // 문자열로 된 데이터를 파싱해서 JsonObject로 만듦
JsonObject response = totalObj.getAsJsonObject("response"); // jsonOjbect에서 response 해당하는 객체값을 얻어옴
JsonObject body = response.getAsJsonObject("body"); // body에 해당하는 값을 담겨옴 -> JsonObject로 반환이 됨
int totalCount = body.get("totalCount").getAsInt(); // 문자열 형태로 가져오고 int자료형으로 꺼내옴
JsonArray items =body.getAsJsonArray("items"); // body 내에서 items라는 키값을 찾아서 꺼내옴.(JsonArray로)
ArrayList<AirVo> list = new ArrayList();
if(items != null) {
for(int i=0; i<items.size(); i++) { // JsonArray를 값 하나하나 꺼내면서
JsonObject obj = items.get(i).getAsJsonObject();
// System.out.println(obj);
AirVo air = new AirVo();
air.setStationName(obj.get("stationName").getAsString()); // 문자열 형태로 얻어옴
if(!obj.get("dataTime").isJsonNull()) { // null값이 있는 경우 오류가 발생해서 묶어줌
air.setDataTime(obj.get("dataTime").getAsString());
air.setCoValue(obj.get("coValue").getAsString());
air.setKhaiValue(obj.get("khaiValue").getAsString());
air.setPm10Value(obj.get("pm10Value").getAsString());
air.setSo2Value(obj.get("so2Value").getAsString());
air.setNo2Value(obj.get("no2Value").getAsString());
air.setO3Value(obj.get("o3Value").getAsString());
}
list.add(air);
}
}
for(AirVo a : list) {
System.out.println(a);
}
br.close();
urlConnection.disconnect(); // 연결종료
}
}
- ctrl+F11눌러서 JUnit Test를 클릭하여 실행! 에러가 안나는지 확인해본다.
=> 값이 정상적으로 출력되는 것을 확인
=> 이코드는 실제 자바에 소스코드를 추가하면 된다!
'공공데이터 활용 > Open API' 카테고리의 다른 글
[Open API] 1-2. 공공데이터 백엔드 서버로 보내서 출력하기 (0) | 2024.02.01 |
---|---|
[Open API] 0. 오픈 API 설정 (0) | 2024.02.01 |