Android 使用Retrofit获取JSON数据
Posted 星辰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 使用Retrofit获取JSON数据相关的知识,希望对你有一定的参考价值。
在大家使用网络请求的时候,往往会出现一种情况:需要拿到服务器返回来的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数据的主要内容,如果未能解决你的问题,请参考以下文章
Android - 获取错误“无法使用Retrofit构建实例(尽管至少存在一个创建)”
我得到了预期的BEGIN_ARRAY,但是在使用Android中的Retrofit(java)尝试获取json时,在第1行第2列路径$中是BEGIN_OBJECT
如何将 AsyncTask 转换为 Retrofit 以从 Android 中的 WCF Webservice 获取数据