码迷,mamicode.com
首页 > 移动开发 > 详细

Android 使用Retrofit获取JSON数据

时间:2017-08-06 14:14:35      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:接收   enter   void   response   ace   base   删除   android   char   

        在大家使用网络请求的时候,往往会出现一种情况:需要拿到服务器返回来的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数据

标签:接收   enter   void   response   ace   base   删除   android   char   

原文地址:http://www.cnblogs.com/zhujiabin/p/7294376.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!