현재 투입중인 프로젝트에서 공공데이터를 가져와야하는 업무를 진행중에 있었다.
내가 작업한 api는 인천공항의 여객운항편 출/도착현황 조회 api인데,
자세한 사용방법과 샘플코드는 아래 페이지에서 확인가능하다.
https://www.data.go.kr/data/15059125/openapi.do
샘플코드
보통 공공데이터는 샘플소스를 제공해주어서, 해당 샘플소스대로 작업을 하면 되는데
샘플소스를 복붙해도 계속 500 에러를 return 하고 있어서 열심히 구글링을 해보았다.
아래 소스는 공공데이터에서 제공된 샘플소스이다.
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()));
}
나와 동일한 케이스를 확인하였고, 아래와같이 해결하게되었다.
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
conn.setRequestProperty("Accept", "application/json"); // 해당부분 추가
Accept의 경우 return을 xml로 받고싶다면 application/xml로 수정하면 된다.
위와같이 적용할경우 return 데이터를 json으로 받게된다.
전체소스
Controller Method
/**
* 항공편 출발 정보
* @param param
* @return
* @throws Exception
* @throws JSONException
* @throws IOException
*/
@RequestMapping(value = "/getPassengerDepartures" , produces = "application/json; charset=utf8")
public @ResponseBody ReturnVo getPassengerDepartures(ParamVo param) throws Exception, JSONException, IOException {
URL url = new URL(rq.getDeparturesFullUrl());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
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();
String str = sb.toString();
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(str);
JsonObject rootob = element.getAsJsonObject().get("response").getAsJsonObject();
JsonObject body = rootob.getAsJsonObject().get("body").getAsJsonObject();
JsonObject items = body.getAsJsonObject().get("items").getAsJsonObject();
Gson gson = new Gson();
MC8_BTMS_AirApi_Controller_AirPassenger_RS item = gson.fromJson(items, MC8_BTMS_AirApi_Controller_AirPassenger_RS.class);
return item;
}
ParamVo
public class ParamVo{
private static String serviceKey = Env.getProperty("openApi.serviceKey");
private static String arrivalsPrefixUrl = Env.getProperty("openApi.info.arr");
private static String departuresPrefixUrl = Env.getProperty("openApi.info.dep");
/** 조회시간(부터) */
private String from_time;
/** 조회시간(까지) */
private String to_time;
/** 출발지 공항 */
private String airport;
/** 편명 */
private String flight_id;
/** 항공사 */
private String airline;
/** 언어구분 */
private String lang;
public String getFrom_time() {
return from_time;
}
public void setFrom_time(String from_time) {
this.from_time = from_time;
}
public String getTo_time() {
return to_time;
}
public void setTo_time(String to_time) {
this.to_time = to_time;
}
public String getAirport() {
return airport;
}
public void setAirport(String airport) {
this.airport = airport;
}
public String getFlight_id() {
return flight_id;
}
public void setFlight_id(String flight_id) {
this.flight_id = flight_id;
}
public String getAirline() {
return airline;
}
public void setAirline(String airline) {
this.airline = airline;
}
public String getLang() {
return lang;
}
public void setLang(String lang) {
this.lang = lang;
}
public String getArrivalsFullUrl() throws UnsupportedEncodingException {
StringBuilder urlBuilder = new StringBuilder(arrivalsPrefixUrl);
urlBuilder.append("?" + URLEncoder.encode("serviceKey", "UTF-8") + "=" + serviceKey);
urlBuilder.append("&" + URLEncoder.encode("to_time", "UTF-8") + "=" + URLEncoder.encode(this.getTo_time(), "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("from_time", "UTF-8") + "=" + URLEncoder.encode(this.getFrom_time(), "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("airport", "UTF-8") + "=" + URLEncoder.encode(ComUtil.null2Blank(this.getAirport()), "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("airline", "UTF-8") + "=" + URLEncoder.encode(ComUtil.null2Blank(this.getAirline()), "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("flight_id", "UTF-8") + "=" + URLEncoder.encode(ComUtil.null2Blank(this.getFlight_id()), "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("lang", "UTF-8") + "=" + URLEncoder.encode(ComUtil.null2Blank(this.getLang()), "UTF-8"));
return urlBuilder.toString();
}
public String getDeparturesFullUrl() throws UnsupportedEncodingException {
StringBuilder urlBuilder = new StringBuilder(departuresPrefixUrl);
urlBuilder.append("?" + URLEncoder.encode("serviceKey", "UTF-8") + "=" + serviceKey);
urlBuilder.append("&" + URLEncoder.encode("to_time", "UTF-8") + "=" + URLEncoder.encode(this.getTo_time(), "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("from_time", "UTF-8") + "=" + URLEncoder.encode(this.getFrom_time(), "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("airport", "UTF-8") + "=" + URLEncoder.encode(ComUtil.null2Blank(this.getAirport()), "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("airline", "UTF-8") + "=" + URLEncoder.encode(ComUtil.null2Blank(this.getAirline()), "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("flight_id", "UTF-8") + "=" + URLEncoder.encode(ComUtil.null2Blank(this.getFlight_id()), "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("lang", "UTF-8") + "=" + URLEncoder.encode(ComUtil.null2Blank(this.getLang()), "UTF-8"));
return urlBuilder.toString();
}
}
serviceKey와 url의 경우 변하지않는 정보이기 때문에 static 변수로 지정했으며,
서버 버전마다 달라질 수 있으므로 properties로 관리하도록 하였다.
'개발' 카테고리의 다른 글
[jquery handlebars] 헬퍼함수 다중조건 if문 사용하기 (0) | 2022.02.11 |
---|---|
[JAVA] Gson으로 String to Json 객체로 변환하기 (0) | 2021.11.02 |
[Python] json dumps로 예쁘게 출력하기 (0) | 2021.10.05 |
티스토리 API - Python으로 글 목록 불러오기 (0) | 2021.10.04 |
[Python] Pycharm 실행 단축키 변경하기 (0) | 2021.10.03 |
댓글