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

api 파싱 질문입니다 (간단한 경로)

0 추천

api파싱해서 지역명을 검색하면 그 지역의 미세먼지 정보를 불러오게 구현을 했는데 

String queryUrl="http://openapi.kepco.co.kr/service/evInfoService/getEvSearchList?"//요청 URL

                +"addr="+location

                +"&pageNo=1&numOfRows=1000&ServiceKey=" + key

위의 코드가 제가 보고 참고한 코드입니다. 저는 addr이 없고 검색기준이 sidoName이여서 그걸로 수정을 했는데  

http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getCtprvnMesureSidoLIst?serviceKey=INtNC54XZqdLzdO%2BaPP5sO9ZR3%2FgW1z7IbGhd6uPOuYaTmB5iYtZKJLRme9rlEEn23GBSkUNSIJUZYQ%2FygATHw%3D%3D&numOfRows=10&pageNo=1&sidoName=부산&searchCondition=DAILY

이렇게 링크중 sidoName에 넣은 한개의 시도의 정보만을 불러옵니다 ㅠㅠ 저부분을 어떻게 수정해야 10개의 시도중 아무거나 거색했을때 해당도시의 정보를 불러올 수 있을까요?

당당 (810 포인트) 님이 2020년 9월 28일 질문
다음처럼 쿼리를 만드는 클래스를 하나 만드세요.

class AddressQueryBuilder {
    public static final String QUERY_URL = "http://openapi.kepco.co.kr/service/evInfoService/getEvSearchList?";

    private String baseUrl;
    private String location;
    private int pageNo;
    private int numOfRows;
    private String serviceKey;
    private String sido;
    private String searchCondition;

    private AddressQueryBuilder(String baseUrl){
        this.baseUrl = baseUrl;
    }

    static final AddressQueryBuilder withBaseUrl(String baseUrl) {
        return new AddressQueryBuilder(baseUrl);
    }

    public AddressQueryBuilder location(String location) {
        this.location = location;
        return this;
    }

    public AddressQueryBuilder pageNo(int pageNo) {
        this.pageNo = pageNo;
        return this;
    }

    public AddressQueryBuilder numOfRows(int numOfRows) {
        this.numOfRows = numOfRows;
        return this;
    }

    public AddressQueryBuilder serviceKey(String serviceKey) {
        this.serviceKey = serviceKey;
        return this;
    }

    public AddressQueryBuilder sido(String sido) {
        this.sido = sido;
        return this;
    }
    public AddressQueryBuilder searchCondition(String searchCondition) {
        this.searchCondition = searchCondition;
        return this;
    }

    public String build() {
        final StringBuilder sb = new StringBuilder();
        sb.append(QUERY_URL)
            .append("addr=").append(location)
            .append("&pageNo=").append(pageNo)
            .append("&numOfRows=").append(numOfRows)
            .append("&ServiceKey=").append(serviceKey)
            .append("&sidoName").append(sido)
            .append("&searchCondition=").append(searchCondition);
        return sb.toString();
    }
}


class Demo {
    public static void main(String[] args) {
        final String queryUrl = AddressQueryBuilder.withBaseUrl(AddressQuery.QUERY_URL)
            .location("somewhere")
            .pageNo(1)
            .numOfRows(1000)
            .sido("부산")
            .serviceKey("INtNC54XZqdLzdO%2BaPP5sO9ZR3%2FgW1z7IbGhd6uPOuYaTmB5iYtZKJLRme9rlEEn23GBSkUNSIJUZYQ%2FygATHw%3D%3D&numOfRows=10&pageNo=1&sidoName=%EB%B6%80%EC%82%B0")
            .searchCondition("DAILY")
            .build();
    }
}

해당 쿼리 필드가 있는지 없는 지 체크해서 Query url을 만드셔야 한다면 AddressQuery 클래스 에 멤버변수들 대신 hashmap을 선언하시고 해당 필드의 세터가 호출 될 때   hashmap을 세팅해주시면 될 것 같습니다. 그리고 build 메소드에서 맵에 있는 필드들을 읽어다 문자열을 붙여주시면 되겠네요.

private final Map<String, String> queryMap = new HashMap<>();

    private AddressQueryBuilder(String baseUrl){
        if (baseUrl != null && !baseUrl.isEmpty())
            this.queryMap.put("addr", baseUrl);
    }

public AddressQueryBuilder location(String location) {
        if (location != null && !location.isEmpty())
            this.queryMap.put("addr", location);
        return this;
    }

   //생략

public String build() {
        final StringBuilder sb = new StringBuilder(QUERY_URL);
        for (Map.Entry<String, String> entry : queryMap.entrySet()) {
            sb.append("&").append(entry.getKey()).append("=").append(entry.getValue());
        }
        return sb.toString();
    }
확인이 늦었네요 답변감사합니다! 한번 참고해서 해보고 다시 댓글 달겠습니다

1개의 답변

0 추천

참고로 밑에 코드도 안됩니다

String queryUrl = "http://openapi.kepco.co.kr/service/evInfoService/getEvSearchList?" + sidoName +
      "serviceKey=INtNC54XZqdLzdO%2BaPP5sO9ZR3%2FgW1z7IbGhd6uPOuYaTmB5iYtZKJLRme9rlEEn23GBSkUNSIJUZYQ%2FygATHw%3D%3D&numOfRows=10&pageNo=1&searchCondition=DAILY&" + key;
당당 (810 포인트) 님이 2020년 9월 28일 답변
...