zoukankan      html  css  js  c++  java
  • Android 使用Retrofit获取JSON数据

            在大家使用网络请求的时候,往往会出现一种情况:需要拿到服务器返回来的JSON字符串,而Retrofit会默认将Json解析,而又没有直接暴露出拿到Json字符串的方法;

          今天测接口的时候,发现当数据正常时,服务器会返回{"code":200,"datas":"1"},当请求参数有错误时,会返回{"code":400,"datas":{"error":"u59d3u540du4e0du80fdu4e3au7a7a"}},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即可。




  • 相关阅读:
    【vim】分割窗口、标签页与Quickfix窗口
    新手学cocos2dx,centos7下的安装过程
    外部排序,杀鸡焉用牛刀?
    5亿整数的大文件,怎么排?
    【Hadoop】HDFS
    你好,树
    写给博客园博客团队,md的预览在哪里?
    老菜鸟致青春,程序员应该选择java 还是 c#-
    高性能server分析
    高性能服务端漫谈
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7294376.html
Copyright © 2011-2022 走看看