서울시 버스 도착 정보 조회

 

● API 사용 신청하기

 

1. 회원가입 후 로그인 진행

우선 아래의 공공데이터 포털에 접속 한 후 회원가입후 로그인을 합니다.

www.data.go.kr/

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 

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입니다. 버스 노선 정보 역시 공공데이터포털에서 잘 검색하면 엑셀표로 된 것이 나오니까 찾아보시고 확인해보세요. 혹은 아래의 파일을 참고하시기 바랍니다.

서울시 버스노선ID 정보(20190508).csv
0.07MB

 

이것을 샘플데이터에 입력해주고 미리보기를 눌러보면 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의 내용을 확인하여 주세요.

 

반응형
블로그 이미지

REAKWON

와나진짜

,