도로명주소 안내시스템 개발자센터

Tech & Tips 상세보기 | 도로명주소 개발자센터

Tech & Tips

API, DB, 전자지도등 도로명주소를 이용한 기술개발 및 활용팁을 올려주세요

Delphi로 검색API 호출 샘플 소스

9541님의 제안

  • 댓글 : 2
  • 조회수 : 1890
  • 추천수 140 +1

2017-09-14

Delphi로 작성한 도로명주소 검색API 호출 샘플 소스입니다. (GET/POST 방식 선택)
개발 시 참고하시기 바랍니다.

1. result type은 xml 입니다. (미지정 시 defualt xml)
2. 본문게시는 API 호출 부분 및 GRID에 결과값 세팅하는 부분만 입니다.
   나머지 부분은 첨부파일 참고하시기 바랍니다.
   .pas 에 해당하는 내용만 포함하였습니다. (dfm file 제외)

##### 이하 샘플소스 #######################################################################

//도로명주소 검색API 호출
procedure TfrmRnAPICall.JusoSearchApiCall(CurPage: integer; CountPerPage: integer);
var sUrl: Widestring;
    Code, searchword : AnsiString;

    Data, DResult : TStringStream;

    OuterRoot, EntryNode:iXmlNode;
    i,j, nTotCnt, k: integer;
    sData: TStringList;
begin

  Data := TStringStream.Create('');
  sData := TStringList.Create;
  DResult := TStringStream.Create('');

  try
    edKey.Text := '승인키';  //신청한 승인키가 없는 경우 테스트용 승인키 'TESTJUSOGOKR' 사용. (고정된 결과값만 리턴됨)
    code := HttpEncode(UTF8Encode(edKey.Text));
   
    //검색어
    searchword := HttpEncode(Utf8Encode(edText.Text)); 

    //API 요청 URL
    sUrl := 'http://www.juso.go.kr/addrlink/addrLinkApi.do'; 
    Indy.Request.Referer := 'http://www.juso.go.kr/addrlink/addrLinkApi.do';

    //GET방식, POST 방식 구분 (화면에서 라디오버튼으로 선택)
    if rbMethod.ItemIndex = 0 then
      begin
        // Get 방식 호출
        sUrl := sUrl + '?currentPage=' +  inttostr(CurPage) + '&countPerPage=' + inttostr(CountPerPage) + '&keyword=' + searchWord + '&confmKey=' + Code;
//        Showmessage(sUrl);
        Indy.Request.ContentType := 'application/json';
        Indy.HTTPOptions := [hoForceEncodeParams];
        Indy.get(sUrl, DResult);
      end
    else
      begin
        //Post 방식 호출
        sData.Values['sendmsg']  := '?currentPage=' + inttostr(CurPage) + '&countPerPage=' + inttostr(CountPerPage) + '&keyword=' + searchWord + '&confmKey=' + Code;
//        Showmessage(sData.Values['sendmsg']);
        Indy.Request.ContentType := 'application/x-www-form-urlencoded';
        Indy.HTTPOptions := [];
        Indy.Post(sUrl, sData, DResult);
      end;

    XMLDocument1.LoadFromStream(DResult);
    XMLDocument1.Active := True;

    OuterRoot := XMLDocument1.DocumentElement;
    nTotCnt := 0;

    //검색결과의 common 영역에서 totalcount, currentPage, countPerPage를 읽어 들임
    //currentPage > 0 (def 1), 0 < countPerPage <= 100 (max 100)이므로 지정범위를 벗어난 값을 호출하면 기본값으로 변경되어 호출시 보낸 값과 다른 값 나옴
    for i:=0 to OuterRoot.ChildNodes.Count-1 do
    begin
      if OuterRoot.ChildNodes[i].NodeName = 'common' then
      begin
        EntryNode := OuterRoot.ChildNodes[i];
        for j:=0 to EntryNode.ChildNodes.Count-1 do
          if EntryNode.ChildNodes[j].NodeName = 'totalCount' then
          begin
            nTotCnt := strtoint(EntryNode.ChildNodes[j].Text);
            Break;
          end;
         
        for j:=0 to EntryNode.ChildNodes.Count-1 do
          if EntryNode.ChildNodes[j].NodeName = 'currentPage' then
          begin
            CurPage := strtoint(EntryNode.ChildNodes[j].Text);
            Break;
          end;

        for j:=0 to EntryNode.ChildNodes.Count-1 do
          if EntryNode.ChildNodes[j].NodeName = 'countPerPage' then
          begin
            CountPerPage := strtoint(EntryNode.ChildNodes[j].Text);
            Break;
          end;

      end;
    end;

    lblTotalCount.Caption := 'Total Count = ' + inttostr(nTotCnt);
    lblCurrentPage.Caption := 'Current Page = ' + inttostr(CurPage);

    //주소 그리드 세팅
    if nTotCnt > 0 then
    begin
      //grid initialization
      initjusoGrid();

      if (nTotCnt mod CountPerPage) > 0 then UpDown1.Max := (nTotCnt div CountPerPage) + 1
      else UpDown1.Max := (nTotCnt div CountPerPage) ;
      UpDown1.Position := CurPage;

      //jusoGrid 셋팅
      jusoGrid.RowCount := CountPerPage + 1;

      k := 1; //jusoGrid의 데이터 시작 행

      for i:=0 to OuterRoot.ChildNodes.Count-1 do
      begin
        if OuterRoot.ChildNodes[i].NodeName = 'juso' then
        begin
          EntryNode := OuterRoot.ChildNodes[i];
          for j:=0 to EntryNode.ChildNodes.Count-1 do
          begin

            if EntryNode.ChildNodes[j].NodeName = 'bdMgtSn'     then jusoGrid.Cells[0, k] := EntryNode.ChildNodes[j].Text;
            if EntryNode.ChildNodes[j].NodeName = 'rnMgtSn'     then jusoGrid.Cells[1, k] := EntryNode.ChildNodes[j].Text;
            if EntryNode.ChildNodes[j].NodeName = 'roadAddr'    then jusoGrid.Cells[2, k] := EntryNode.ChildNodes[j].Text;
            if EntryNode.ChildNodes[j].NodeName = 'jibunAddr'   then jusoGrid.Cells[3, k] := EntryNode.ChildNodes[j].Text;
            if EntryNode.ChildNodes[j].NodeName = 'engAddr'     then jusoGrid.Cells[4, k] := EntryNode.ChildNodes[j].Text;
            if EntryNode.ChildNodes[j].NodeName = 'zipNo'       then jusoGrid.Cells[5, k] := EntryNode.ChildNodes[j].Text;
            if EntryNode.ChildNodes[j].NodeName = 'admCd'       then jusoGrid.Cells[6, k] := EntryNode.ChildNodes[j].Text;
            if EntryNode.ChildNodes[j].NodeName = 'detBdNmList' then jusoGrid.Cells[7, k] := EntryNode.ChildNodes[j].Text;

            if chkExtending.Checked then
            begin
              if EntryNode.ChildNodes[j].NodeName = 'bdNm'     then jusoGrid.Cells[ 8, k] := EntryNode.ChildNodes[j].Text;
              if EntryNode.ChildNodes[j].NodeName = 'bdKdcd'   then jusoGrid.Cells[ 9, k] := EntryNode.ChildNodes[j].Text;
              if EntryNode.ChildNodes[j].NodeName = 'siNm'     then jusoGrid.Cells[10, k] := EntryNode.ChildNodes[j].Text;
              if EntryNode.ChildNodes[j].NodeName = 'sggNm'    then jusoGrid.Cells[11, k] := EntryNode.ChildNodes[j].Text;
              if EntryNode.ChildNodes[j].NodeName = 'emdNm'    then jusoGrid.Cells[12, k] := EntryNode.ChildNodes[j].Text;
              if EntryNode.ChildNodes[j].NodeName = 'liNm'     then jusoGrid.Cells[13, k] := EntryNode.ChildNodes[j].Text;
              if EntryNode.ChildNodes[j].NodeName = 'rn'       then jusoGrid.Cells[14, k] := EntryNode.ChildNodes[j].Text;
              if EntryNode.ChildNodes[j].NodeName = 'udrtyn'   then jusoGrid.Cells[15, k] := EntryNode.ChildNodes[j].Text;
              if EntryNode.ChildNodes[j].NodeName = 'buldMnnm' then jusoGrid.Cells[16, k] := EntryNode.ChildNodes[j].Text;
              if EntryNode.ChildNodes[j].NodeName = 'buldSlno' then jusoGrid.Cells[17, k] := EntryNode.ChildNodes[j].Text;
              if EntryNode.ChildNodes[j].NodeName = 'mtyn'     then jusoGrid.Cells[18, k] := EntryNode.ChildNodes[j].Text;
              if EntryNode.ChildNodes[j].NodeName = 'lnbrMnnm' then jusoGrid.Cells[19, k] := EntryNode.ChildNodes[j].Text;
              if EntryNode.ChildNodes[j].NodeName = 'lnbrSlno' then jusoGrid.Cells[20, k] := EntryNode.ChildNodes[j].Text;
            end;
          end;
          k := k+1;
        end;
      end;
    end;
  finally
    XMLDocument1.Active := False;
    Data.Free;
    sData.Free;
    DResult.Free;
  end;
end;
##### 샘플소스 END  ####################################################################### 

 

첨부파일 RnAPICall.zip

댓글쓰기

댓글쓰기

댓글2

첨부파일이 없다는데 다시 게시해주시면안될가요
좋은자료 감사합니다.
  • 감사님
  • 2017-09-21
저도 찾던 자료네요, 참고하겠습니다