마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

api 정보 xml로 받아서 출력하는방법

0 추천
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.io.BufferedReader;
import java.io.IOException;

public class ApiExplorer {
    public static void main(String[] args) throws IOException {
        StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/B551182/hospInfoService1/getHospBasisList1"); /*URL*/
        urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=서비스키"); /*Service Key*/
        urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
        urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("10", "UTF-8")); /*한 페이지 결과 수*/
        urlBuilder.append("&" + URLEncoder.encode("sidoCd","UTF-8") + "=" + URLEncoder.encode("110000", "UTF-8")); /*시도코드*/
        urlBuilder.append("&" + URLEncoder.encode("sgguCd","UTF-8") + "=" + URLEncoder.encode("110019", "UTF-8")); /*시군구코드*/
        urlBuilder.append("&" + URLEncoder.encode("emdongNm","UTF-8") + "=" + URLEncoder.encode("신내동", "UTF-8")); /*읍면동명*/
        urlBuilder.append("&" + URLEncoder.encode("yadmNm","UTF-8") + "=" + URLEncoder.encode("서울의료원", "UTF-8")); /*병원명(UTF-8 인코딩 필요)*/
        urlBuilder.append("&" + URLEncoder.encode("zipCd","UTF-8") + "=" + URLEncoder.encode("2010", "UTF-8")); /*분류코드(활용가이드 참조)*/
        urlBuilder.append("&" + URLEncoder.encode("clCd","UTF-8") + "=" + URLEncoder.encode("11", "UTF-8")); /*종별코드(활용가이드 참조)*/
        urlBuilder.append("&" + URLEncoder.encode("dgsbjtCd","UTF-8") + "=" + URLEncoder.encode("01", "UTF-8")); /*진료과목코드(활용가이드 참조)*/
        urlBuilder.append("&" + URLEncoder.encode("xPos","UTF-8") + "=" + URLEncoder.encode("127.09854004628151", "UTF-8")); /*x좌표(소수점 15)*/
        urlBuilder.append("&" + URLEncoder.encode("yPos","UTF-8") + "=" + URLEncoder.encode("37.6132113197367", "UTF-8")); /*y좌표(소수점 15)*/
        urlBuilder.append("&" + URLEncoder.encode("radius","UTF-8") + "=" + URLEncoder.encode("3000", "UTF-8")); /*단위 : 미터(m)*/
        URL url = new URL(urlBuilder.toString());
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-type", "application/json");
        System.out.println("Response code: " + conn.getResponseCode());
        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);
        }
        rd.close();
        conn.disconnect();
        System.out.println(sb.toString());
    }
}

대학 팀프로젝트 만드는 중입니다

 병원정보 api샘플코드이구요 textview로 화면에 출력이라도 되게 해보려는데 

class쪽에 extend도 없고? 어떻게 사용하는지 모르겠네요 막막합니다 

 

안드프젝 (160 포인트) 님이 2022년 4월 2일 질문

1개의 답변

+1 추천
 
채택된 답변
public class ApiExplorer {
     private static final String BASE_URL  = "http://apis.data.go.kr/B551182/hospInfoService1/getHospBasisList1";
     
    public String execute(ApiExplorerRequest request) {
        String urlString = request.buildUrl(BASE_URL);
        URL url = new URL(urlString);
        ...
        return sb.toString();
    }

    public static void main(String[] args) throws IOException {
         ApiExplorer apiExplorer = new ApiExplorer();
         ApiExplorerRequest request = new ApiExplorerRequest(...);
         ApiExplorer.execute(request);
    }
}

위처럼, main에 있는 코드를 재사용이 가능하도록 ApiExplorer 쪽으로 옮기세요.

다음으로, 아래처럼 execute를 동적인 쿼리가 가능하게, url을 구성하는 부분을 파라미터로 빼네세요.

public class ApiExplorerRequest {
   private final String serviceKey; /*Service Key*/
   private final int pageNo; /*페이지번호*/
   ...
   private final int radius; /*단위 : 미터(m)*/

   // 생성자, getter 생략

 
   public String buildUrl(String baseUrl) {
        StringBuilder urlBuilder = new StringBuilder(baseUrl); /*URL*/
        urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=" + serviceKey);
        urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("" + pageNo, "UTF-8")); 
        ...
        urlBuilder.append("&" + URLEncoder.encode("radius","UTF-8") + "=" + URLEncoder.encode("" + radius, "UTF-8")); 
        return urlBuilder.toString();
   }
}

 

그리고 XML파싱 필요하면  파싱클래스를 임포트 추가해서 하셔야 해요.  ApiExplorer의 execute를 호출한 다음 리턴된 문자열을 파싱하면 되겠죠. 개발자 문서를 읽어보시고 진행하시면 됩니다.

https://developer.android.com/training/basics/network-ops/xml

Edit:  코드의 순서가 바뀌어서, 고쳤어요.

builder pattern 예는 아래로 별도로 빼놓을 게요. 이 패턴은 파라미터가 많아서 오브젝을 생성을 직관적으로 만들기 위해서 사용합니다.

public class ApiExplorerRequest {
   private final String baseUrl;
   private final String serviceKey; /*Service Key*/
   private final int pageNo; /*페이지번호*/
   ...
   private final int radius; /*단위 : 미터(m)*/

     // 생성자를 private으로 하여 강제로 buider method인 with를 사용하게 만듦.
     private ApiExplorerRequest() {}
     private ApiExplorerRequest(String baseUrl) {
         this.baseUrl = baseUrl;
     }

     public static ApiExplorerRequest with(baseUrl) {
          return ApiExplorerRequest(baseUrl);
     }
    
    public ApiExplorerRequest serviceKey(String value) {
        this.serviceKey = value;
        return this;
    }
    ...
    public ApiExplorerRequest radius(int value) {
        this.radius = radius;
        return this;
    }

   public String build() {
        StringBuilder urlBuilder = new StringBuilder(baseUrl); /*URL*/
        urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=" + serviceKey);
        urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("" + pageNo, "UTF-8")); 
        ...
        urlBuilder.append("&" + URLEncoder.encode("radius","UTF-8") + "=" + URLEncoder.encode("" + radius, "UTF-8")); 
        return urlBuilder.toString();
   }
}

// 사용예
ApiExplorerRequest request = ApiExplorerRequest.with(BASE_URL)
        .serviceKey("서비스키")
        .pageNo(1)
        ...
        .radius(3000)
        .build();

그리고 ApiExplorer에 있는 main()은 안드로이드에서는 의미가 없는 코드이므로 삭제해주세요. ApiExplorer클래스 이름도 역할에 맞는 좀 더 적합한 이름으로 주세요. 예를 들면, HospitalApi, ClicnicApi 등등...
ApiExplorer.execute() 메소드의 이름도 역할에 걸맞는 이름으로 고치세요. "GET", "Content-type", "application/json", response Code인 200, 300 등도 상수로 치환하시구요. HTTP_OK.= 200, HTTP_REDIRECTION = 300 (https://developer.mozilla.org/en-US/docs/Web/HTTP/Status)

BASE_URL은 아래 페이지를 참고하셔셔, build.gradle에 집어넣으세요.

https://stackoverflow.com/questions/51373523/change-buildconfig-file-in-android-studio-using-gradle

그리고 아래처럼 접근하시면 됩니다.

BuildConfig.API_BASE_URL
spark (224,800 포인트) 님이 2022년 4월 2일 답변
spark님이 2022년 4월 3일 수정
그리고 올리신 코드는 XML응답이 아니라 JSON이예요.^^
...