1. 程式人生 > >Android 使用Retrofit獲取JSON數據

Android 使用Retrofit獲取JSON數據

value callback dma 調用 exception trace erro spa quest

在大家使用網絡請求的時候,往往會出現一種情況:需要拿到服務器返回來的JSON字符串,而Retrofit會默認將Json解析,而又沒有直接暴露出拿到Json字符串的方法;

今天測接口的時候,發現當數據正常時,服務器會返回{"code":200,"datas":"1"},當請求參數有錯誤時,會返回{"code":400,"datas":{"error":"\u59d3\u540d\u4e0d\u80fd\u4e3a\u7a7a"}},datas裏一會兒是字符串,一會兒是對象,這時就不能用JAVABEAN的形式接收返回數據了。

示例:

//刪除地址
@FormUrlEncoded
@POST(ServiceAddr.ADDR_DEL_URL)
Observable
<ResponseBody> delAddr(@FieldMap HashMap<String,String> map);
//刪除地址
@FormUrlEncoded
@POST(ServiceAddr.ADDR_DEL_URL)
Call<ResponseBody> delAddr2(@FieldMap HashMap<String,String> map);
Presenter層:
public void delAddr(String baseUrl,HashMap<String,String> map){
    addrManageModel.delAddr(baseUrl, map)
            .subscribe(
new Subscriber<ResponseBody>() { @Override public void onCompleted() { Logger.t(TAG).d("地址刪除成功"); } @Override public void onError(Throwable e) { Logger.t(TAG).d("地址刪除失敗
"+e.getMessage()); } @Override public void onNext(ResponseBody responseBody) { BufferedSource source = responseBody.source(); try { source.request(Long.MAX_VALUE); // Buffer the entire body. } catch (IOException e) { e.printStackTrace(); } Buffer buffer = source.buffer(); Charset charset = UTF8; MediaType contentType = responseBody.contentType(); if(contentType != null){ charset = contentType.charset(UTF8); //獲取Response的body的字符串 並打印 Logger.t(TAG).d(buffer.clone().readString(charset)); addrManageView.delAddrShow(buffer.clone().readString(charset)); } } }); }
或者
public void delAddr2(String baseUrl,HashMap<String,String> map){
    addrManageModel.delAddr2(baseUrl, map).enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
            Logger.t(TAG).d(response.body().toString()+"===="+response.message()+"==="+response.code());
            BufferedSource source = response.body().source();
            try {
                source.request(Long.MAX_VALUE); // Buffer the entire body.
            } catch (IOException e) {
                e.printStackTrace();
            }
            Buffer buffer = source.buffer();

            Charset charset = UTF8;
            MediaType contentType = response.body().contentType();
            if(contentType != null){
                charset = contentType.charset(UTF8);
                //獲取Response的body的字符串 並打印
                Logger.t(TAG).d(buffer.clone().readString(charset));
                addrManageView.delAddrShow(buffer.clone().readString(charset));
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {

        }
    });
}
在頁面上調用:
delAddrShow()更新UI即可。





Android 使用Retrofit獲取JSON數據