서울시 버스 도착 정보 조회
● API 사용 신청하기
1. 회원가입 후 로그인 진행
우선 아래의 공공데이터 포털에 접속 한 후 회원가입후 로그인을 합니다.
2. 원하는 Open API를 검색
로그인을 하고 난 이후에 맨 위 상단에 데이터찾기 -> 데이터목록 을 찾아 클릭 한 후 검색 조건을 지정하여 API를 검색할 것입니다. 이때 우리가 사용할 API는 서울시 버스 도착 정보 조회입니다.
그냥 검색하면 너무 많은 버스 관련 API들이 검색되기 때문에 제공기관별검색을 눌러 자치행정기관 - 서울특별시 - 서울특별시를 선택해줍시다.
그 후 검색창에 "버스 조회" 를 검색하면 중간 부분에 오픈 API가 검색이 되는데 버스도착정보조회 서비스가 우리가 사용할 API가 됩니다.
눌러서 들어가보면 4개의 API를 사용할 수가 있는 것을 볼 수 있습니다.
API에 대한 간단한 설명을 아래의 표로 정리하였습니다.
일련번호 |
API명(국문) |
상세기능명(영문) |
상세기능명(국문) |
1 |
버스도착정보조회 서비스 |
getArrInfoByRouteAllList |
경유노선전체정류소별도착예정정보목록조회 |
2 |
버스도착정보조회 서비스 |
getArrInfoByRouteList |
정류소노선별도착예정정보목록조회 |
3 |
버스도착정보조회 서비스 |
getLowArrInfoByRouteList |
정류소의특정노선교통약자용도착예정정보목록조회 |
4 |
버스도착정보조회 서비스 |
getLowArrInfoByStIdList |
정류소별교통약자용도착예정정보목록조회 |
3. 활용신청
검색했다고 그냥 쓸 수 있는 것은 아니고 활용 신청하면 API를 사용할 수 있습니다. 오른쪽 활용신청을 클릭해줍니다.
여기서 활용목적은 앱개발이며 간단히 어떻게 사용할 것인지만 적어주면 됩니다. 밑에 시스템 유형은 일반으로 지정해주면 됩니다.
그리고 더 아래에는 일일 트래픽 1000을 허용하며 추후에 신청하여 늘릴 수 있다고 합니다.
이렇게 신청했다고 바로 API가 사용가능한 상황은 되지 않고 1~2시간 정도가 지나야 API를 사용할 수 있습니다.
4. API 테스트 해보기
우선 웹사이트상에서 미리보기를 확인할 수 있습니다. 저는 특정 노선 ID를 통해서 경우노선 전체를 확인해보고자 합니다. 110A 고려대 버스의 노선 정보가 궁금합니다. 이때 버스 노선 ID는 100100016입니다. 버스 노선 정보 역시 공공데이터포털에서 잘 검색하면 엑셀표로 된 것이 나오니까 찾아보시고 확인해보세요. 혹은 아래의 파일을 참고하시기 바랍니다.
이것을 샘플데이터에 입력해주고 미리보기를 눌러보면 xml으로 정보를 잘 얻어오는 것을 확인해볼 수 있습니다.
●API 사용해보기
1. 인터넷 사용권한
AndroidManifest.xml에서 인터넷 사용권한을 지정해줍니다.
<uses-permission android:name="android.permission.INTERNET" />
2. Traffic 허용
그리고 다음과 같이 xml을 지정하여 우리가 사용하는 api 사이트의 traffic을 허용해주어야합니다. 아래와 같이 network_security_config.xml을 파일을 만든 후에 내용을 입력해주세요.
network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">ws.bus.go.kr</domain>
</domain-config>
</network-security-config>
이 파일을 다시 AndroidManifest.xml 파일에 지정해주어야 트래픽이 허용됩니다.
<application
android:allowBackup="true"
...
android:theme="@style/Theme.Chat"
android:networkSecurityConfig="@xml/network_security_config">
3. HttpURLConnection으로 데이터 받기
네트워크를 사용할 것이니 Thread를 사용합니다. 아래는 공공데이터에서 제공하는 getArrInfoByRouteAll를 활용하는 자바 샘플 코드입니다.
public class NetworkThread extends Thread{
@Override
public void run() {
try {
StringBuilder urlBuilder = new StringBuilder("http://ws.bus.go.kr/api/rest/arrive/getArrInfoByRouteAll");
Log.e("MY_TEST","urlBuilder");
urlBuilder.append("?" + URLEncoder.encode("ServiceKey", "UTF-8") + "=servicekey");
urlBuilder.append("&" + URLEncoder.encode("busRouteId", "UTF-8") + "=" + URLEncoder.encode("100100016", "UTF-8"));
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
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);
}
Log.e("BUS_API_TEST",sb.toString());
rd.close();
conn.disconnect();
}catch(Exception e){
e.printStackTrace();
}
}
}
위에서 보시면 ws.bus.go.kr이 우리가 트래픽을 허용한 주소라는 것을 알 수 있습니다. servicekey는 각자 자신이 받은 servicekey를 적어주시면 됩니다. 활용신청이 완료되었다면 인증키가 보일텐데 인코딩된 키를 이 부분에 사용하시면 됩니다.
이후 MainActivity에서는 그 쓰레드를 실행시키면 되지요.
public class MainActivity extends AppCompatActivity {
private NetworkThread thread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
thread=new NetworkThread();
thread.start();
}
}
이제 실행 후 확인해보면 정상적으로 값을 로그로 출력함을 확인해볼 수 있습니다.
이 후부터는 이제 xml 데이터를 파싱해서 알맞게 사용하시면 됩니다.
발생할 수 있는 오류
만약 SERVICE KEY IS NOT REGISTERED ERROR 가 발생했다면 등록한 Service ID가 틀렸거나 아직 서비스 ID가 등록되어있지 않았기 때문에 조금 더 기다렸다가 해보시기 바랍니다.
만약 응답을 아예 받아올 수 없는 경우에는 ws.bus.go.kr 에 트래픽 허용을 안해줘서 그렇습니다. 위 network_security_config.xml의 내용을 확인하여 주세요.
'안드로이드' 카테고리의 다른 글
[안드로이드] 알람(Alarm)을 받는 수신자(Receiver)에서 알림(Notification) 구현 코드 (2) | 2021.08.23 |
---|---|
[안드로이드] XmlPullParser로 Xml 파싱하는 방법 - 코드 예제 (0) | 2021.05.26 |
[안드로이드] RecyclerView 수평 이동 및 한번에 항목 하나만 보이게 만들기 (0) | 2020.07.01 |
[안드로이드] AsyncTask를 이용하여 시계(Timer) 구현 (0) | 2020.06.29 |
[안드로이드] ViewPager와 TabLayout으로 slide화면 구현 (0) | 2020.03.22 |