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

retrofit simplexml 공공data 질문입니다.

0 추천

안녕하세요.

http://apis.data.go.kr/1230000/OrderPlanSttusService/getOrderPlanSttusListServc?serviceKey=9j9xGgJKOdgGJGJTWwKyhJv1JYATU502xB9fnCM2mFTIz0hGtjBBOSlN2WdCKAI0I%2BAX%2BBPuDWwYt176hWOJrA%3D%3D&numOfRows=10&pageSize=10&pageNo=1&startPage=1&inqryDiv=1&orderBgnYm=201606&orderEndYm=201608&inqryBgnDt=201606010000&inqryEndDt=201606282359

이러한 공공data를 읽어오려는데 제대로 파싱이 되지 않는 것 같습니다. 소스 첨부합니다

private void get() {
    Retrofit retrofit;
    retrofit = new Retrofit.Builder()
            .baseUrl(getString(R.string.api_host))
            .addConverterFactory(SimpleXmlConverterFactory.create())
            .build();
    LinkedHashMap<String, String> options = new LinkedHashMap<>();
    try {
        options.put(URLEncoder.encode("ServiceKey", "UTF-8"), getString(R.string.auth_key));
        options.put(URLEncoder.encode("numOfRows", "UTF-8"), URLEncoder.encode("10", "UTF-8"));
        options.put(URLEncoder.encode("pageSize", "UTF-8"), URLEncoder.encode("10", "UTF-8"));
        ...
    } catch (IOException e) {
        e.printStackTrace();
    }

    RetrofitService retrofitService = retrofit.create(RetrofitService.class);
    Call<ResponseItem> call = retrofitService.getItem(options);
    
    call.enqueue(new Callback<ResponseItem>() {
        @Override
        public void onResponse(Call<ResponseItem> call, Response<ResponseItem> response) {
            ResponseItem item = response.body();

            Log.d(TAG, response.message());
            Log.d(TAG, item.getBody().getItems().getItemList().get(0).getAgrmntYn());
            Log.d(TAG, response.headers().toString());
        }

        @Override
        public void onFailure(Call<ResponseItem> call, Throwable t) {
            t.printStackTrace();
            Log.d(TAG, t.getMessage());
            Log.d(TAG, "onFailure");
        }
    });
}
@Root(name = "response", strict = false)
public class ResponseItem {

    @Element(name = "header", required = false)
    Header header;

    @Element(name = "body", required = false)
    Body body;
    
}
@Root(name = "header", strict = false)
public class Header {
    @Element(name = "resultCode", required = false)
    String resultCode;

    @Element(name = "resultMsg", required = false)
    String resultMsg;

    public String getResultCode() {
        return resultCode;
    }

    public String getResultMsg() {
        return resultMsg;
    }
}
@Root(name = "body")
public class Body {
    @Element(name = "items")
    Items items;

    @Element(name = "numOfRows")
    int numOfRows;

    @Element(name = "pageNo")
    int pageNo;

    @Element(name = "totalCount")
    int totalCount;
}
@Root(name = "items")
public class Items {
    @ElementList(name = "item", inline = true)
    List<Item2> itemList;
}
@Root(name = "item", strict = false)
public class Item2 {
    @Element(name = "bsnsDivCd")
    private int bsnsDivCd;

    @Element(name = "bsnsDivNm")
    private String bsnsDivNm;

    @Element(name = "bsnsTyCd")
    private String bsnsTyCd;

    @Element(name = "bsnsTyNm")
    private String bsnsTyNm;

    @Element(name = "orderYear")
    private int orderYear;

    ...
}

며칠째 고생중입니다 ㅠㅠ 다른 xml예제는 성공했는데 어디가 문제인지 감이 안잡힙니다..

도움 부탁드립니다 (__)

배쟁 (760 포인트) 님이 2017년 12월 27일 질문
소스만 올릴게 아니고 오류 로그를 올려야죠
오류 로그는 없습니다.. onResponse로 넘어가는데 item을 가져오려하면 널포인트 익셉션이떠요
널포인트 익셉션이떠요 ==> 그걸 오류 로그라고 부릅니다.
네.. 아는데요 별다른 오류 로그가 아니라 말씀을 안드린겁니다 이것만 봐서는 어떤오류인지 알 수 없잖아요. 할당이 안되는 오류말고는
하...................
뭐하자는겁니까? 질문에 대한 답변을 기다린거지 이런 되지도 않는 시비붙자고 질문올린게 아닌데요? 내가 궁금한건 어노테이션이 속성이라든지 쿼리스트링 넘기는게 잘못돼서 그런건지 궁금해서 질문올린거지 당신 한숨보려고 질문올린거 아닙니다.
샘플데이터를 제대로 파싱하는지 JUnit 테스트를 작성해서 문제가 되는 부분만 집중 디버깅해보세요. 문제의 범위를 줄여나가는 것이 문제를 해결하는데 좀 더 쉬운 접근방법입니다.
말씀으로 봐서는 response의 body 부분이 제대로 파싱이 안되는 것 같은데 해당 부분을 차근차근 디버깅 해보세요.

1개의 답변

0 추천
1. postman 으로 api를 호출했을 때 제대로 오는 지 확인한다.

=> 제대로 안 오면 호출할 때 오류

 

2. postman에서는 잘 넘어오는데, 코드에서는 안된다

=> json 형태와 수신하려는 클래스 형태가 틀렸을 가능성 있음

 

 

이런 질문을 할 때는 받으려는 json 도 같이 올려주시면 좋습니다. 그래야 답변할 사람이 판단하기가 쉬워요.

그리고 예비 답변자와 싸우지 마세요. 아쉬운 건 질문자이지 예비답변자가 아닙니다. 예비답변자는 판단에 필요한 정보를 더 달라고하는데, 질문자가 '그런 정보는 주고 싶지 않습니다' 모드로 나오면 누가 답변을 달겠습니까?
쎄미 (162,410 포인트) 님이 2017년 12월 28일 답변
감사합니다. xml은 글자수 제한으로 url으로 올려드렸어요.
...