본문 바로가기
개발

[공공데이터] 인천공항 API 호출시 500 오류

by 정보알려주는언니 2021. 10. 22.

현재 투입중인 프로젝트에서 공공데이터를 가져와야하는 업무를 진행중에 있었다.

내가 작업한 api는 인천공항의 여객운항편 출/도착현황 조회 api인데, 

자세한 사용방법과 샘플코드는 아래 페이지에서 확인가능하다.

 

 

 

https://www.data.go.kr/data/15059125/openapi.do

 

인천국제공항공사_여객편 운항현황 (다국어)

인천공항 여객 항공기 출발 / 도착 정보 현황조회

www.data.go.kr

 

샘플코드


보통 공공데이터는 샘플소스를 제공해주어서, 해당 샘플소스대로 작업을 하면 되는데

샘플소스를 복붙해도 계속 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으로 받게된다. 

 

 

OKKY | 공공데이터 API 자바로 작성 중에 질문이 있습니다!

안녕하세요? 공공 데이터 API 사용 중 문제가 잘 해결되지 않아 글을 남기게 되었습니다. 현재 자바로 인천국제공항의 운행현황을 받아오는 API를 작성 중에 있으며 계속 500 에러를 표출합니다.

okky.kr

 

 

 

전체소스


 

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로 관리하도록 하였다. 

 

 

 


댓글