매일 눈팅만 하다가 처음으로 글을 써보네요.

 

지하철 도착정보, 수질/대기현황, 분실물, 문화, 일자리 정보 등등
서울시청에서  제공하는 공공정보 API 서비스 입니다.

 

한번도 안해본 soap을 사용하느라...

한나절동안 열심히 구글링만 했네요..

맞게 쓰고있는지는 모르겠고... 어쨋든 결과는 나오네요ㅡㅡ;

 

http://mobile.openapi.seoul.go.kr/

회원가입하고 인증키 발급신청하면 됩니다.

저는 신청하고 하루정도 걸렸네요. 

위 사이트에 연동규격서도 제공하니 받아보시면 되겠습니다.

 

필요한 라이브러리는 ksoap과  commons-codec 라이브러리를 사용했습니다.

구글에서 ksoap 과 base64/connons-codec 검색하시면 쉽게 찾을수 있을겁니다.

 

reqeust와 response 소스입니다.

 

import org.apache.commons.codec.binary.Base64;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;
import org.kxml2.kdom.Element;
import org.kxml2.kdom.Node;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity implements OnClickListener{
 
 private static final String METHOD_NAME = "searchSubwayArriveListByFrCode";
 private static final String SOAP_ACTION = "http://schemas.xmlsoap.org/soap/envelope/SubwayArriveService?wsdl/"+METHOD_NAME;
    private static final String NAMESPACE = "http://service.arrive.subway.openapi.ubizvalley.com";
    private static final String URL = "http://115.84.165.130/SeoulOpenAPI/services/SubwayArriveService?wsdl";
     
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.btn).setOnClickListener(this);
    }

 @Override
 public void onClick(View view) {
  switch(view.getId()){
  case R.id.btn :
   test();
  }
 }

 public void test(){
  Element h = new Element().createElement(NAMESPACE, "authInfo");    
  Element username = new Element().createElement(NAMESPACE, "userId");    
  username.addChild(Node.TEXT, "YOUR ID");    
  h.addChild(Node.ELEMENT, username);
  
  Element authkey = new Element().createElement(NAMESPACE, "authKey");    
  authkey.addChild(Node.TEXT, encodeBinary("YOUR AUTHKEY".getBytes()));    
  h.addChild(Node.ELEMENT, authkey);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.headerOut = new Element[1];
        envelope.headerOut[0] = h;
 
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

  request.addProperty("frCode", "P153");
  request.addProperty("forGubun", "1");

        envelope.setOutputSoapObject(request);
        AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);
        androidHttpTransport.debug = true;
        try {
            androidHttpTransport.call(SOAP_ACTION, envelope);
            System.out.println(androidHttpTransport.requestDump);
            SoapObject sobj = (SoapObject)envelope.getResponse();
            Log.e("xx",sobj.toString());
        }catch (Exception e){
            e.printStackTrace ();;
        }
 }
 
 public static String encodeBinary(byte[] src) {
  try {
   return new String(Base64.encodeBase64(src));
  } catch(Throwable e) {
   e.printStackTrace();
  }
  return null;
 }
}


파싱해서 쓰시면 됩니다..

 

개인적으로 지하철 도착정보를 제공하는게 참 좋으네요..

실제 정확하게 맞는지는 저도 모르겠습니다.

 

그럼 모두 즐프~~