> iPhone-iPad, Objective-C > SOAP 형태의 서울시 공공정보 OpenAPI를 iOS에서 사용하기.

SOAP 형태의 서울시 공공정보 OpenAPI를 iOS에서 사용하기.

모바일 앱 개발을 진행하며, 서울시에서 제공하는 공공정보 API는 매우 유용하게 활용할 수 있어 보였습니다. 그래서, 관련 정보를 연동하기 위한 작업은 진행하는데, 생각보다 바로 되지 않았습니다. 바로, SOAP형태의 웹서비스 연동이 잘 안되었던 것입니다. 그래서, 여기저기 자료를 찾아보니 wsdl2ObjC라는 구글 코드에 있는 오픈 프로젝트도 있었습니다.

wsdl2objC를 간단하게 소개를 하자면, wsdl을 입력해 주면, binding, request 그리고 response에 해당하는 소스를 자동으로 생성해 주는 툴이였습니다. 그러나, 서울시 공공정보 OpenAPI는 그 소스를 이용해도 접근이 안되었습니다.(혹시, 잘 되시는 분들은 알려주시면 좋겠습니다.) 그리고, 몇가지 다양한 오류를 보고 확인하는 작업을 통해 연동 할 수 있었습니다.
지하철 노선의 역 정보를 가져오는 관련 코드는 아래와 같습니다.

NSString *soapMessage =
"<?xml version='1.0' encoding='utf-8'?>"
"<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>"
"<soapenv:Header>"
"<authInfo:userId xmlns:authInfo='http://mobile.openapi.seoul.go.kr/SeoulOpenAPI/services/SubwayStationService?wsdl'>%@</authInfo:userId>"
"<authInfo:authKey xmlns:authInfo='http://mobile.openapi.seoul.go.kr/SeoulOpenAPI/services/SubwayStationService?wsdl'>%@</authInfo:authKey>"
"</soapenv:Header>"
"<soapenv:Body>"
"<ns5:searchSubwayStationListByLineNum xmlns:ns5='http://service.station.subway.openapi.ubizvalley.com'>"
"<ns5:lineNum>4</ns5:lineNum>"
"<ns5:sortItem />"
"<ns5:sortStd />"
"<ns5:cPage>1</ns5:cPage>"
"<ns5:pageSize>5</ns5:pageSize>"
"</ns5:searchSubwayStationListByLineNum>"
"</soapenv:Body>"
"</soapenv:Envelope>"];

soapMessage = [NSString stringWithFormat:soapMessage, /*개발자 아이디 문자열*/, /*base64로 인코딩된 인증키 값*/]; 

NSURL * url = [NSURL URLWithString:@"http://mobile.openapi.seoul.go.kr/SeoulOpenAPI/services/SubwayStationService?wsdl"]; 

NSMutableURLRequest * theRequest = [NSMutableURLRequest requestWithURL:url]; 
NSString * msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]]; 
[theRequest addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [theRequest addValue:@"http://service.station.subway.openapi.ubizvalley.com/SubwayStationService/searchSubwayStationListByLineNum" forHTTPHeaderField:@"SOAPAction"]; 
[theRequest addValue:msgLength forHTTPHeaderField:@"Content-Length"]; 
[theRequest setHTTPMethod:@"POST"]; 
[theRequest setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

NSURLConnection *connection = [[[NSURLConnection alloc]initWithRequest:theRequest delegate:self]autorelease]; 

이하는 NSURLConnection 통신의 방식을 따라 수집된 XML을 파싱하여 사용하면 됩니다.
앞으로 서울시 공공정보 OpenAPI를 활용한 다양한 아이폰 앱을 개발해 보아야 겠습니다.

  1. 2012/02/24 22:04

    혹시 Open.go.kr에서 자료 가져오시는 거 성공하셨나요?

    저도 지금 일주일째 매달리고 있는데 자료찾기도 힘들고 영 힘드네요.

    RESTful방식은 그냥 자료를 뽑아내면 되는 것같은데.. 서비스 코드를 넣으실때

    저는 url인코딩으로 접근하고 있는데 잘안되네요 ^^;;

    SOAP방식은 wsdl2ObjC이용해도 그다음이 문제네요;;

    혹시이 두가지다 구현 해내셨나요;

    • 2012/02/25 17:55

      아직 open.go.kr에서 데이터를 가져오는 것을 해 보지는 않았습니다. 그래서, 딱히 말씀드릴 것이 없네요.
      혹시, 지금 연동하고 싶은 api에 대한 정보를 주시면, 시도해 보고 어떤 방식으로 접근하는게 좋을지 논의할 수 있을 것 같습니다.

  2. 2012/02/27 13:21

    답변이 좀 늦어졌습니다.

    WSDL URL http://api.epeople.go.kr/soap/MyCivilAppealService?wsdl
    End Point http://api.epeople.go.kr/soap/MyCivilAppealService
    데이터포맷 XML

    No 오퍼레이션명(영문) 오퍼레이션명(한글) 오퍼레이션 설명 활용승인
    승인절차 신청가능
    최대트래픽
    1 getMyCivilAppealItem 나의민원항목조회 나의민원항목조회 승인심의 20,000
    2 getMyCivilAppealList 나의민원목록조회 나의민원목록조회 승인심의 20,000
    3 setMyCivilAppealUpdate 나의민원수정 나의민원수정 승인심의 20,000
    4 setMyCivilAppealCancel 나의민원취하 나의민원취하 승인심의 20,000

    서비스명 나의민원서비스 제공기관 국민권익위원회
    버전 1.0 등록일자 2010-12-21
    서비스 유형 SOAP 사용제한여부 사용가능
    서비스 설명 나의민원서비스
    검색태그 민원 정치 행정
    공유범위 행정/공공/민간
    사용유형 비상업용
    분류체계 정치/행정/민원

    이걸 구현하려고 시도 중인데… 좀 어렵네요.

    wsdl2Obj를 이용할경우에는

    저 위에 소스와 어떻게 조합을 해야하는지 감이 안잡혀서요..;;

    저 소스는 wsdl2Obj없이 할때 이용하는 방법인가요?

    답변 주셔서 감사합니다.

    • 2012/02/28 13:10

      네.. 저는 wsdl2Obj를 이용하는 방법보다는 SoapMessage를 직접 만들어서 데이터를 다운 받는 형태를 사용했습니다.
      주신 내용을 테스트 해보려면 주민번호나 암호 같은 것을 넣어 주어야 하는 것 같네요.

  3. 2012/03/03 15:23

    좋은 자료 감사합니다.
    많은 도움이 되었네요.
    역시 soap 노가다네요 -0-ㅋ;;

    • 2012/03/04 10:55

      도움이 되셨다니 기쁩니다.
      soap이 표준이기는 했지만, 지금은 너무 번거로워서 사용을 많이 하지 않죠.
      빨리 우리 공공기관도 REST방식을 많이 지원했으면 좋겠습니다. ^^

  1. No trackbacks yet.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: