Open API


Open API 는 3.7.13 버전 이상 부터 제공되며 해당 라이브러리를 추가하여 사용해야 된다.

Open API 를 이용하기 위해서는 먼저 관련 API 에 대한 인증 키를 발급 받아야 하며 이는 API 별로 상이할 수 있다. HSP 에서는 인증키 관리를 단말이 아닌 Operation Admin 페이지에서 할 수 있도록 메뉴를 제공하고 있고, 다수개의 인증 키를 입력 받아 API 별 하루 요청 제한에 대한 대응을 할 수 있도록 구현되어 있다. (만약 하루에 500 건 한도가 존재하는 API 이면 다수개의 인증 키를 추가하여 500 건 이상의 요청을 할 수 있게 한다.)

스크린샷 2018-11-06 오전 10.44.46.png


getAddress

Address 는 찾고자 하는 주소의 특정 단어를 2 글자 이상으로 전달하여 검색하고 그 검색 결과를 전달 받는 API 이다.

Address 는 도로명주소 안내시스템에서 제공하는 Open API 를 이용하여 구현하고 있으며 해당 API 를 호출 하기 위한 인증 키는 도로명주소 안내시스템 개발자센터에서 신청 하여 발급받을 수 있다.

API 요청 시 주의할 점은 Chrome 브라우저에서는 해당 페이지가 열리지 않으므로 다른 브라우저 (IE) 를 이용해서 신청 해야 하며, 신청 하여 얻은 인증키는 HSP 의 Operation Admin 에서 등록하여 관리할 수 있다. Address 의 경우 하루에 요청할 수 있는 API 요청이 무제한이므로 다수개의 인증 키를 넣을 필요는 없다.

address 요청 시 필요한 인자 정보는 아래와 같으며 해당 API 에 대한 자세한 세부내용이 필요할 경우는 웹사이트인 도로명주소 안내시스템에서 확인할 수 있다.

NoNameDescriptions
1keyword검색어
2pageNo현재 페이지 번호
3perPage페이지당 출력할 결과 수

스크린샷 2018-11-06 오전 10.54.28.png

Example

///////////////
// 3.10.18 이상
///////////////
let api = DAPOpenAPI()
let param = DAPOpenAPIGetAddressParam()
param.keyword = "파인에비뉴"
param.pageNo = "1"
param.perPage = "10"
api.execute(with: param, completion: { (dict) in
   
}) { (resultError) in
   
}


///////////////
// 3.10.18 이하
///////////////
let api = DAPOpenAPI()
let dict = ["keyword":"파인에비뉴", "pageNo":"1", "perPage":"10"]
let params = [dict]
api.execute(withActionName: "getaddress", params: params, completion: { (dict) in
   guard let resultDict = dict else {
       return
    }

}) { (resultError) in
   guard let error = resultError else {
       return
    }
}

///////////////
// 3.10.18 이상
///////////////
DAPDeviceAPI *deviceAPI = [DAPOpenAPI new];
DAPOpenAPIGetAddressParam *infoParam = [DAPOpenAPIGetAddressParam new];
infoParam.keyword = @"파인에비뉴";
infoParam.pageNo = @"1";
infoParam.perPage = @"10";
[deviceAPI executeWithParam:infoParam completion:^(NSDictionary *resultDict) {
   NSString *deviceResult = [resultDict objectForKey:kDeviceResult];
    NSLog(@"deviceResult : %@", deviceResult);
} failure:^(NSError *error) {
    NSLog(@"error : %@", [error userInfo]);
}];

///////////////
// 3.10.18 이하
///////////////
NSDictionary *paramDict = [NSDictionary dictionaryWithObjectsAndKeys:@"파인에비뉴", @"keyword", @"1", @"pageNo", @"10", @"perPage", nil];
DAPOpenAPI *deviceAPI = [DAPOpenAPI new];
NSArray *params = [NSArray arrayWithObjects:paramDict, [HMPCommonUtil deviceAPIWithServiceName:kNetwork], nil];
[deviceAPI executeWithActionName:@"getaddress" params:params completion:^(NSDictionary *resultDict) {
    NSLog(@"%s %d\nresultDict %@", __PRETTY_FUNCTION__, __LINE__, resultDict);
    [self openWeatherAPI];
} failure:^(NSError *error) {
    NSLog(@"%s %d\nerror %@", __PRETTY_FUNCTION__, __LINE__, error);
}];

 

Result

{
   "results": {
       "common": {
           "errorMessage": "정상",
           "countPerPage": "10",
           "totalCount": "1",
           "errorCode": "0",
           "currentPage": "1"
        },
       "juso": [{
           "detBdNmList": "B 동,파인에비뉴",
           "engAddr": "100, Eulji-ro, Jung-gu, Seoul",
           "rn": "을지로",
           "emdNm": "을지로 2 가",
           "zipNo": "04551",
           "roadAddrPart2": " (을지로 2 가)",
           "emdNo": "02",
           "sggNm": "중구",
           "jibunAddr": "서울특별시 중구 을지로 2 가 203 파인에비뉴",
           "siNm": "서울특별시",
           "roadAddrPart1": "서울특별시 중구 을지로 100",
           "bdNm": "파인에비뉴",
           "admCd": "1114010500",
           "udrtYn": "0",
           "lnbrMnnm": "203",
           "roadAddr": "서울특별시 중구 을지로 100 (을지로 2 가)",
           "lnbrSlno": "0",
           "buldMnnm": "100",
           "bdKdcd": "0",
           "liNm": "",
           "rnMgtSn": "111403101006",
           "mtYn": "0",
           "bdMgtSn": "1114010500101450000000001",
           "buldSlno": "0"
        }]
    }
}

Table. address 오류 메시지

메시지조치방법
시스템에러도로명주소 도움센터로 문의 하기
승인되지 않은 키 입니다.정확한 승인 키를 입력하세요 (검색 API 승인키 사용불가)
정상적인 경로로 접속하시기 바랍니다.요청변수 중 returnUrl 항목이 없습니다. 요청 변수를 다시 확인하세요
검색어가 입력되지 않았습니다.검색 어를 입력해주세요
주소를 상세히 입력해 주시기 바랍니다.시도 명으로 검색이 불가 합니다.
검색 어는 두 글자 이상 입력되어야 합니다.한 글자만으로는 검색이 불가합니다.
검색 어는 문자와 숫자 같이 입력되어야 합니다.숫자만으로는 검색이 불가합니다.
검색어가 너무 깁니다. (한글 40 자 영문, 숫자 80 자 이하)80 글자를 초과하는 검색 어는 검색이 불가합니다.
검색어에 너무 긴 숫자가 포함되어 있습니다.10 자리를 초과하는 숫자가 포함된 검색 어는 검색이 불가합니다.
특수문자 + 숫자만으로는 검색이 불가능 합니다.특수문자와 숫자만으로 이루어진 검색 어는 검색이 불가합니다.
  

Table. 주소항목 설명

출력변수명타입필수여부설명
roadFullAddr String  전체 도로명 주소
roadAddrPart1 String  도로명 주소 (참고항목 제외)
roadAddrPart2 String  도로명 주소 (참고항목 제외)
jibunAddr String  지번주소
engAddrString  도로명 주소 (영문)
zipNo String  우편번호
addrDetail String  고객 입력 상세 주소
admCd String  행정구역코드
rnMgtSn String  도로명코드
bdMgtSn String  건물관리번호
detBdNmList String  상세건물명
bdNm String  건물명
bdKdcd String  공동주택 여부 (1:공통주택, 0: 비공동주택)
siNm String  시도명
sggNm String  시군구명
emdNm String  읍면동명
liNm String  법정리명
rn String  도로명
udrtYn String  지하여부 (0: 지상, 1: 지하)
buldMnnm Number  건물본번
buldSlno Number  건물부번
mtYn String  산 여부 (0: 대지, 1: 산)
lnbrMnnm Number  지번본번 (번지)
lnbrSlno Number  지번부번 (호)
emdNo String  읍/면/동 일련번호
    

getWeather

Weather 는 GPS 의 위도 / 경도 정보를 전달하여 해당 위치의 날씨 정보를 검색해 그 결과를 전달 받는 API 이다.

Weather 는 공공데이터 포털에서 제공하는 동네예보정보조회서비스를 이용하여 구현하고 있으며 해당 사이트에서 Open API 를 호출하기 위한 인증 키도 신청 가능 하다. 신청 후 얻은 인증 키는 HSP 의 Operation 서버에 등록하여 관리할 수 있으며, 다수 개의 인증 키를 입력 시에는 사용하고 있는 인증키가 하루에 요청할 수 있는 제한을 초과 하였을 때 다음 인증 키를 사용하여 재 호출 하도록 설계되었다.

Weather 요청 시 필요한 인자는 아래와 같으며 인자에 대한 세부 내용은 관련 웹 페이지인 동네예보정보조회서비스에서 확인할 수 있다.

Table. Weather 인자 정보

NoNameDescriptions
1latitude위도
2longitude경도
3pageNo현재 페이지 번호
4perPage페이지당 출력할 결과 수
   

Example

///////////////
// 3.10.18 이상
///////////////
let api = DAPOpenAPI()
let param = DAPOpenAPIGetWeatherParam()
param.latitude = "37.565774"
param.longitude = "126.988375"
param.pageNo = "1"
param.perPage = "10"
api.execute(with: param, completion: { (dict) in
   
}) { (resultError) in
   
}


///////////////
// 3.10.18 이하
///////////////
let api = DAPOpenAPI()
let dict = ["latitude":"37.565774", "longitude":"126.988375", "pageNo":"1", "perPage":"10"]
let params = [dict]
api.execute(withActionName: "getweather", params: params, completion: { (dict) in
   guard let resultDict = dict else {
       return
    }

}) { (resultError) in
   guard let error = resultError else {
       return
    }
}

///////////////
// 3.10.18 이상
///////////////
DAPDeviceAPI *deviceAPI = [DAPOpenAPI new];
DAPOpenAPIGetWeatherParam *infoParam = [DAPOpenAPIGetWeatherParam new];
infoParam.latitude = @"37.565774";
infoParam.longitude = @"126.988375";
infoParam.pageNo = @"1";
infoParam.perPage = @"10";
[deviceAPI executeWithParam:infoParam completion:^(NSDictionary *resultDict) {
   NSString *deviceResult = [resultDict objectForKey:kDeviceResult];
    NSLog(@"deviceResult : %@", deviceResult);
} failure:^(NSError *error) {
    NSLog(@"error : %@", [error userInfo]);
}];



///////////////
// 3.10.18 이하
///////////////
DAPOpenAPI *deviceAPI = [DAPOpenAPI new];
NSDictionary *paramDict = [NSDictionary dictionaryWithObjectsAndKeys:@"37.565774", @"latitude", @"126.988375", @"longitude", @"1", @"pageNo", @"10", @"perPage", nil];
NSArray *params = [NSArray arrayWithObjects:paramDict, [HMPCommonUtil deviceAPIWithServiceName:kNetwork], nil];
[deviceAPI executeWithActionName:@"getweather" params:params completion:^(NSDictionary *resultDict) {
    NSLog(@"%s %d\nresultDict %@", __PRETTY_FUNCTION__, __LINE__, resultDict);
} failure:^(NSError *error) {
    NSLog(@"%s %d\nerror %@", __PRETTY_FUNCTION__, __LINE__, error);
}];

 

API 요청 시 응답 받는 데이터는 형태는 아래와 같으며 response -> header -> resultCode 항목에서 API 요청이 제대로 이루어 졌는지 확인할 수 있다.

Result

{
   "response":{
       "header":{
           "resultCode":"0000",
           "resultMsg":"OK"
        },
       "body":{
           "items":{
               "item":[{
                   "baseDate":20151013,
                   "baseTime":1600,
                   "category":"LGT",
                   "nx":55,
                   "ny":127,
                   "obsrValue":0
                }]
            },
           "numOfRows":10,
           "pageNo":1,
           "totalCount":10
        }
    }
}

Table. Weather 결과 정보 

CodeMessageDescriptions
0000성공 
01Application Error  제공기관 서비스 제공 상태가 원활하지 않습니다.
02DB Error  제공기관 서비스 제공 상태가 원활하지 않습니다.
03No Data  데이터 없음 오류
04HTTP Error  제공기관 서비스 제공 상태가 원활하지 않습니다.
05Service Timeout  제공기관 서비스 제공 상태가 원활하지 않습니다.
10Invalid Parameter Error  Open API 요청 시 Service Key 파라 미터가 누락되었습니다.
11필수 요청 파라 미터가 없음  요청 하신 Open API 의 필수 파라 미터가 누락되었습니다.
12해당 오픈 API 서비스가 없거나 폐기됨  Open API 호출 시 URL 이 잘못 됨
20서비스 접근 오류  활용승인이 나지 않은 Open API 호출
22서비스 요청 제한 횟수 초과 에러  일일 활용 건수가 초과 함 (활용건수 증가 필요)
30등록되지 않은 서비스 키  잘못된 서비스 키를 사용하였거나 서비스 키를 URL 인코딩 하지 않음
31기한 만료된 서비스 키  Open API 사용 기간이 만료됨
32등록되지 않은 도메인명 또는 IP 주소  활용 신청한 서버의 IP 와 실제 Open API 호출한 서버가 다름
   

Table. 아이템 항목 설명

항목(영문)항목(국문크기구분샘플설명
baseDate발표일자8120181212발표일
baseTime발표시각610600발표 시간
nx예보지점 x 좌표2059입력한 예보지점 X 좌표
ny예보지점 y 좌표20125입력한 예보지점 Y 좌표
category자료구분코드31LGT자료구분코드
obsrValue실황 값200RN1, T1H, UUU, VVV, WSD 실수로 제공
      

Table. 초 단기 실황 코드 값

항목 값항목 명단위압축비트수
T1H기온°C10
RN11 시간 강수량mm8
SKY하늘 상태코드 값4
UUU동서 바람 성분m/s12
VVV남북 바람 성분m/s12
REH습도%8
PTY강수형태코드 값4
LGT낙뢰코드 값4
VEC풍향010
WSD풍속110
    

Table. 하늘(SKY) 상태 코드 값

코드맑음구름조금구름많음흐림
SKY  1  2  3  4
     

Table. 강수형태 (PTY) 상태 코드 값

코드없음진눈개비
PTY1234
     

Table. 강수량 (RN1, R06) 범주 및 표시 방법 (값)

범주문자열 표시GRIB 저장 값
0.1mm 미만0mm 또는 없음0
0.1mm 이상 1mm 미만1mm 미만1
1mm 이상 5mm 미만14mm5
5mm 이상 10mm 미만59mm10
10mm 이상 20mm 미만1019mm20
20mm 이상 40mm 미만2039mm40
40mm 이상 70mm 미만4069mm70
70mm 이상 70mm 이상100
   

Table. 적설 (S06) 범주 및 표시방법 (값)

범주문자열 표시GRIB 저장 값
0.1cm 미만0cm 또는 없음0
0.1cm 이상 1cm 미만1cm 미만1
1cm 이상 5cm 미만14cm5
5cm 이상 10cm 미만59cm10
10cm 이상 20cm 미만1019cm20
20cm 이상 20cm 이상100
   

Table. 낙뢰코드 (LGT) 정보

코드없음있음
LGT01
   

Table. 풍속 정보

코드+-
UUU
VVV
   

getAir

Air 는 지정한 주소 (구) 위치의 공기 질을 반환하는 API 이며 공공데이터 포털에서 제공하는 대기오염정보조회서비스를 이용하여 구현하고 있다. API 를 호출하기 위한 인증 키도 해당 사이트에서 신청 가능 하며 신청 후 얻은 인증 키는 HSP 의 Operation 서버에 등록하여 관리할 수 있다.

다수 개의 인증 키를 입력 시에는 사용하고 있는 인증키가 하루에 요청할 수 있는 제한을 초과 하였을 때 다음 인증 키를 사용하여 재 호출 하도록 설계되었다.

Air 요청 시 필요한 인자는 아래와 같으며 인자에 대한 세부 내용은 관련 웹 페이지인 대기오염정보조회서비스 에서 확인할 수 있다.

Table. getAir 인자 정보

NoNameDescriptions
1keyword주소 (구 정보)
2pageNo현재 페이지 번호
3perPage페이지당 출력할 결과 수
   

Example

///////////////
// 3.10.18 이상
///////////////
let api = DAPOpenAPI()
let param = DAPOpenAPIGetAirParam()
param.keyword = "종로구"
param.pageNo = "1"
param.perPage = "10"
api.execute(with: param, completion: { (dict) in
   
}) { (resultError) in
   
}


///////////////
// 3.10.18 이하
///////////////
let api = DAPOpenAPI()
let dict = ["keyword":"종로구", "pageNo":"1", "perPage":"10"]
let params = [dict]
api.execute(withActionName: "getair", params: params, completion: { (dict) in
   guard let resultDict = dict else {
       return
    }

}) { (resultError) in
   guard let error = resultError else {
       return
    }
}

///////////////
// 3.10.18 이상
///////////////
DAPDeviceAPI *deviceAPI = [DAPOpenAPI new];
DAPOpenAPIGetAirParam *infoParam = [DAPOpenAPIGetAirParam new];
infoParam.keyword = @"종로구";
infoParam.pageNo = @"1";
infoParam.perPage = @"10";
[deviceAPI executeWithParam:infoParam completion:^(NSDictionary *resultDict) {
   NSString *deviceResult = [resultDict objectForKey:kDeviceResult];
    NSLog(@"deviceResult : %@", deviceResult);
} failure:^(NSError *error) {
    NSLog(@"error : %@", [error userInfo]);
}];


///////////////
// 3.10.18 이하
///////////////
NSDictionary *paramDict = [NSDictionary dictionaryWithObjectsAndKeys:@"종로구", @"keyword", @"1", @"pageNo", @"10", @"perPage", nil];
DAPOpenAPI *deviceAPI = [DAPOpenAPI new];
NSArray *params = [NSArray arrayWithObjects:paramDict, [HMPCommonUtil deviceAPIWithServiceName:kNetwork], nil];
[deviceAPI executeWithActionName:@"getair" params:params completion:^(NSDictionary *resultDict) {
    NSLog(@"%s %d\nresultDict %@", __PRETTY_FUNCTION__, __LINE__, resultDict);
    [self openAddressAPI];
} failure:^(NSError *error) {
    NSLog(@"%s %d\nerror %@", __PRETTY_FUNCTION__, __LINE__, error);
}];

 

Result

<response>
   <header>
       <resultCode>00</resultCode>
       <resultMsg>NORMAL SERVICE.</resultMsg>
   </header>
  <body>
       <items>
           <item>
               <dataTime>2018-09-21 14:00</dataTime>
               <mangName>도시대기</mangName> <so2Value>0.002</so2Value>
               <coValue>0.2</coValue>
               <o3Value>0.025</o3Value>
               <no2Value>0.021</no2Value>
               <pm10Value>16</pm10Value>
               <pm10Value24>11</pm10Value24>
               <pm25Value>9</pm25Value>
               <pm25Value24>7</pm25Value24>
               <khaiValue>42</khaiValue>
               <khaiGrade>1</khaiGrade>
               <so2Grade>1</so2Grade>
               <coGrade>1</coGrade>
               <o3Grade>1</o3Grade>
               <no2Grade>1</no2Grade>
               <pm10Grade>1</pm10Grade>
               <pm25Grade>1</pm25Grade>
               <pm10Grade1h>1</pm10Grade1h>
               <pm25Grade1h>1</pm25Grade1h>
           </item>
           <!-- 중략 -->
       </items>
   </body>
</response>

Table. Air 결과 정보 

CodeMessageDescriptions
00성공 
01Application Error제공기관 서비스 제공 상태가 원활하지 않습니다.
02DB Error제공기관 서비스 제공 상태가 원활하지 않습니다.
03No Data데이터 없음 오류
04HTTP Error제공기관 서비스 제공 상태가 원활하지 않습니다.
05Service Timeout제공기관 서비스 제공 상태가 원활하지 않습니다.
10Invalid Parameter ErrorOpen API 요청 시 Service Key 파라 미터가 누락되었습니다.
11필수 요청 파라 미터가 없음요청 하신 Open API 의 필수 파라 미터가 누락되었습니다.
12해당 오픈 API 서비스가 없거나 폐기됨Open API 호출 시 URL 이 잘못 됨
20서비스 접근 오류활용승인이 나지 않은 Open API 호출
22서비스 요청 제한 횟수 초과 에러일일 활용 건수가 초과 함 (활용건수 증가 필요)
30등록되지 않은 서비스 키잘못된 서비스 키를 사용하였거나 서비스 키를 URL 인 코딩 하지 않음
31기한 만료된 서비스 키Open API 사용 기간이 만료됨
32등록되지 않은 도메인 명 또는 IP 주소활용 신청한 서버의 IP 와 실제 Open API 호출한 서버가 다름
   

Table. 아이템 항목 설명

항목(영문)항목(국문)크기구분샘플설명
dataTime 측정일2012018-04- 20 15:00오염도 측정일
mangName측정망 정보101도시대기측정망 정보 (국가배경, 교외대기, 도시대기, 도로변 대기)
so2Value아황산가스 농도1010.007아황산가스 농도 (단위 : ppm)
coValue일산화탄소 농도1010.4일산화탄소 농도 (단위 : ppm)
o3Value오존 농도1010.043오존 농도 (단위 : ppm)
no2Value이산화질소 농도1010.024이산화질소 농도 (단위 : ppm)
pm10Value미세먼지 (PM10) 농도10173미세먼지 (PM10) 농도 (단위 : μg/m&sup3emoticon_wink
pm10Value24미세먼지 (PM10) 24 시간 예측 이동 농도10155미세먼지 (PM10) 24 시간 예측 이동 농도 (단위 : μg/m&sup3emoticon_wink
pm25Value미세먼지 (PM2.5) 농도10173미세먼지 (PM2.5) 농도 (단위 : μg/m&sup3emoticon_wink
pm25Value24미세먼지 (PM2.5) 24 시간 예측 이동 농도10131미세먼지 (PM2.5) 24 시간 예측 이동 농도 (단위 : μg/m&sup3emoticon_wink
khaiValue통합 대기 환경 수치10175통합 대기 환경수치
khaiGrade통합 대기 환경 지수1012통합 대기 환경 지수
so2Grade아황산가스 지수1011아황산가스 지수
coGrade일산화탄소 지수1011일산화탄소 지수
o3Grade오존 지수1012오존 지수
no2Grade이산화질소 지수1011 이산화질소 지수
pm10Grade미세먼지 (PM10) 24 시간 등급1012미세먼지 (PM10) 24 시간 등급자료
pm25Grade미세먼지 (PM2.5) 24 시간 등급1012미세먼지 (PM2.5) 24 시간 등급자료
pm10Grade1h미세먼지 (PM10) 1 시간 등급1012미세먼지 (PM10) 1 시간 등급자료
pm25Grade1h미세먼지 (PM2.5) 1 시간 등급1012미세먼지 (PM2.5) 1 시간 등급자료
      

Table. 항목별 Grade 값의 의미

등급좋음보통나쁨매우 나쁨
Grade1234
     

getSearch

Search 는 지정된 검색 어를 통해 네이버 / 다음 / 구글의 검색엔진을 통해 검색 결과를 화면에 보여주는 API 이며 search 에 필요한 인자는 아래와 같다.

NoNameDescriptions
1keyword검색어
2from검색 엔진 (google, naver, daum)
3windowName검색 결과를 출력할 Web 형태의 윈도우 또는 팝업 윈도우 명

인자가 전달되면 대상이 되는 웹 윈도우에 검색엔진의 결과를 화면에 출력하여 화면에 표현된다.

Example

///////////////
// 3.10.18 이상
///////////////
let api = DAPOpenAPI()
let param = DAPOpenAPIGetSearchParam()
param.keyword = "hanwha"
param.from = "google"
param.windowName = "defaultWebPopupWindow"
api.execute(with: param, completion: { (dict) in
   
}) { (resultError) in
   
}


///////////////
// 3.10.18 이하
///////////////
let api = DAPOpenAPI()
let params = ["hanwha", "google", "defaultWebPopupWindow"]
api.execute(withActionName: "search", params: params, completion: { (dict) in
   guard let resultDict = dict else {
       return
    }

}) { (resultError) in
   guard let error = resultError else {
       return
    }
}

///////////////
// 3.10.18 이상
///////////////
DAPDeviceAPI *deviceAPI = [DAPOpenAPI new];
DAPOpenAPIGetSearchParam *infoParam = [DAPOpenAPIGetSearchParam new];
infoParam.keyword = @"hanwha";
infoParam.from = @"google";
infoParam.windowName = @"defaultWebPopupWindow";
[deviceAPI executeWithParam:infoParam completion:^(NSDictionary *resultDict) {
   NSString *deviceResult = [resultDict objectForKey:kDeviceResult];
    NSLog(@"deviceResult : %@", deviceResult);
} failure:^(NSError *error) {
    NSLog(@"error : %@", [error userInfo]);
}];

///////////////
// 3.10.18 이하
///////////////
NSString *keyword = @"hanwha";
NSString *from = @"google";
NSString *windowName = @"defaultWebPopupWindow";

DAPOpenAPI *deviceAPI = [DAPOpenAPI new];
NSArray *params = [NSArray arrayWithObjects:keyword, from, windowName, [HMPCommonUtil deviceAPIWithServiceName:kNetwork], nil];
[deviceAPI executeWithActionName:@"search" params:params completion:^(NSDictionary *resultDict) {
    NSLog(@"%s %d\nresultDict %@", __PRETTY_FUNCTION__, __LINE__, resultDict);
} failure:^(NSError *error) {
    NSLog(@"%s %d\nerror %@", __PRETTY_FUNCTION__, __LINE__, error);
}];