前一段时间项目中使用了Retrofit,看了一下文档,学习了一下。分享给大家。
一、概述 Retrofit是Square公司开发的一个类型安全的Java和Android 的REST客户端库。来自官网的介绍:
A type-safe HTTP client for Android and Java Rest API是一种软件设计风格,服务器作为资源存放地。客户端去请求GET,PUT, POST,DELETE资源。并且是无状态的,没有session的参与。关于REST的介绍可以参考维基百科 retrofit模型如下:(来自如何使用Retrofit写一个Android的REST客户端的小教程)
retrofit模型
- POJO或模型实体类 : 从服务器获取的JSON数据将被填充到这种类的实例中。
- 接口 : 我们需要创建一个接口来管理像GET,POST...等请求的URL,这是一个服务类。
- RestAdapter类 : 这是一个REST客户端(RestClient)类,retrofit中默认用的是Gson来解析JSON数据,你也可以设置自己的JSON解析器。 二、原理 在发起请求时,整个框架主要通过Call来封装每一次的请求。 调用同步方法时,会使用应用线程来发送请求; 调用异步方法时会通过 OkHttp 的 Dispatcher 提供的线程来执行请求。
在modul的build文件下的dependencies中添加
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
点击Sync Now (或)导jar包,点击下载
retrofit-2.0.0-beta2.jar| Retrofit库 converter-gson-2.0.0-beta2_.jar | Gson解析库
gson-2.4.jar | Gson解析库 okhttp-2.5.0.jar | Okhttp请求库 okio-1.6.0.jar | Okhttp请求库
说明: Retrofit依赖于okhttp,所以需要集成okhttp API返回的数据为JSON格式,在此我使用的是Gson对返回数据解析 添加权限 由于是网络请求,需要在manifest中添加网络请求的权限
JSON数据
复制JSON字符串到输入框中,填写报名、类名,源代码类型选择JSON,注解类型选择Gson,点击Preview即可得到对应的POJO,如下图
复制到jsonschema2pojo中
点击preview,得到对应的实体类。将其拷贝到自己的工程中即可。
得到的实体类 import com.google.gson.annotations.SerializedName; @Generated("org.jsonschema2pojo") 可删除 创建一个Retrofit 对象(核心用法一) Retrofit retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create())//解析方法 //这里建议:- Base URL: 总是以/结尾;- @Url: 不要以/开头 .baseUrl("http://www.wangyinews.com.cn/") .build(); 接口申明(核心用法二) public interface NewsService { /**
- 根据newsid获取对应的资讯数据
- 如果不需要转换成Json数据,可以用了ResponseBody;
- @param newsId
- @return call */ @GET("News/{newsId}") Call
getNews(@Path("newsId") String newsId); } 若需要重新定义接口地址可以使用@Url,例: @GET Call - > getActivitySubjectsList(
@Url String url, @QueryMap Map map);
Call
@Override
public void onResponse(Response response) {
//成功返回数据后在这里处理,使用response.body();
获取得到的结果
News news = response.body();
}
@Override
public voidonFailure(Throwable t) {
//请求失败在这里处理
}
});
【retrofit的简单使用】 取消请求(核心用法六) call.cancel(); 完成以上步骤就可以实现一个简单的网络请求了。 Tips: 当返回结果错误,调用response.errorBody().string(); 可以得到String类型的请求结果,但再次调用response.errorBody().string(); 得到的结果为""。具体原因不明