Retrofit简介
1.Retrofit干什么的?
Retrofit让你便捷地封装出一个类来给其它地方调用和服务器进行HTTP API调用。
比如,一般来说,不用retrofit的时候,你需要填写http参数,然后get数据下来,然后解析,然后。。。。
用了retrofit之后,你只需a.xxget("参数值")拿到一个对象,就可访问服务器返回的数据了。
retrofit一般都是结合okhttp使用。
2.定义服务接口类
要想做到上面说的“a.xxget”就能简单调用HTTP服务器上的API,需要定义一个interface类,然后使用retrofit对这个类进行实现。
例如下面的interface类:
public interface GitHubService {@GET("users/{user}/repos")Call<List<Repo>> listRepos(@Path("user") String user); }
然后通过retrofit提供的功能来配置和实现这个接口:
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").build();GitHubService service = retrofit.create(GitHubService.class);
这样,如果你调用service.listRepos("xiaoli")就等效于访问了“https://api.github.com/users/xiaoli/repos”,并拿到这个地方返回的数据。像下面这样:
Call<List<Repo>> repos = service.listRepos("xiaoli");
3.注解编写
retrofit一大特点就是通过注解来定制调用服务器API时候HTTP请求的一些参数配置。所以需要了解如何retrofit支持的注解。
retrofi一共有5个注解:GET,POST,PUT,DELETE,HEAD。
每个API都要写上相关的注解,说明API是怎么调用的。
例如以下的GET注解,表示“listRepos”函数使用GET的方法访问HTTP的网址:
public interface GitHubService {@GET("users/{user}/repos")Call<List<Repo>> listRepos(@Path("user") String user); }
接下来详细介绍一下注解使用规则。
4.URL封装
“@Path”:地址中关联变量
注解中的url地址,可以和变量关联,用大括号(“{ }”)包括,而相应地,在函数参数中用@Path指明变量就可以。
例如下面的变量“id”:
@GET("group/{id}/users") Call<List<User>> groupList(@Path("id") int groupId);
“@Query”:关联单个查询参数变量
API中如有“?”后面的那些参数,可以用“@Query”来关联变量。
例如有这样一个API请求URL(两个查询参数:access_token和openid):
https://login.xx.cn/mobile/login?access_token=12345&openid=56789
相应retrofit的规则写法如下:
@GET("/mobile/login") void getMyMessage(@Query("access_token") String access_token, @Query("openid") String openId);
"@QueryMap" : 关联多个查询参数变量
API中如果有很多查询参数,每个都写一个“@Query”明显太麻烦,所以retrofit又提供了“@QueryMap ”可以一次指定多个参数变量。
例如上面的接口又可以这样写:
@GET("/mobile/login") void getMyMessage(@QueryMap HashMap<String,String> queryparams);
使用的时候:
HashMap<String,String> params = new HashMap();
params.put("access_token",token);
params.put("openid",openid);serviceAPI.getMyMessage(params);
注意:“@QueryMap”使用在POST方法,参数会写在url中,服务器编写要注意接收参数而不是body。
5.Header封装
“@Headers”:指定Header域数据
例如:
@Headers("Cache-Control: max-age=640000") @GET("widget/list") Call<List<Widget>> widgetList();
@Headers({"Accept: application/vnd.github.v3.full+json","User-Agent: Retrofit-Sample-App" }) @GET("users/{username}") Call<User> getUser(@Path("username") String username);
Header与数据动态关联
可以在接口参数中使用“@Header”动态关联变量,
例如下面的代码,关联了“Authorization”域的值由变量authorization提供:
@GET("user") Call<User> getUser(@Header("Authorization") String authorization)
注意:如果每个请求都想添加一些特定头域数据,请使用okhttp的拦截器。
okhttp拦截器的例子:
OkHttpClient client = new OkHttpClient();
client.networkInterceptors().add(new Interceptor() {@Overridepublic com.squareup.okhttp.Response intercept(Chain chain) throws IOException {com.squareup.okhttp.Response response = chain.proceed(chain.request());tokenRequest = response.newBuilder().header("token", "1234567").build();return chain.proceed(tokenRequest);}
});
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)....client(client).build();
6.请求数据体封装设置
“@FormUrlEncoded ”: 变量提供表单式数据
会以application/x-www-form-urlencoded类型作为body,参考例子:
@FormUrlEncoded @POST("user/edit") Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
注意使用了“@Field”来定义了key-value的键值对数据。
"@Multipart " : 关联变量实现multipart数据提供
使用“@Part”来关联变量动态对part提供数据。
参考例子:
@Multipart @PUT("user/photo") Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
“@Body”: 实现请求的数据体关联变量
参考下面的例子:
@POST("/mobile/login") void getMyMessage(@Body HashMap<String,String> reqbodydata);
另外一种,使用java类实体变量的例子:
@POST("/mobile/login") void getMyMessage(@Body User reqbodydata);
7.同步和异步特性
可以通过Call方式实现同步或者异步调用,每个Call实例只能调用一次。需要再调用,则要clone一个新的。
看例子。
定义:
import retrofit.Call;/* Retrofit 2.0 */
public interface APIService {@POST("/list")Call<Repo> loadRepo();
}
同步调用:
// Synchronous Call in Retrofit 2.0Call<Repo> call = service.loadRepo();
Repo repo = call.execute();
异步调用:
// Synchronous Call in Retrofit 2.0
Call<Repo> call = service.loadRepo();
call.enqueue(new Callback<Repo>() {@Overridepublic void onResponse(Response<Repo> response) {// Get result Repo from response.body()}@Overridepublic void onFailure(Throwable t) {}
});
注意,Callback被调用的时候,如果是android平台,是在主线程,而如果是“JVM”中,则和HTTP请求同一个线程。
可以取消正在进行的请求:call.cancel() 。
8.结束
retrofit是个方便我们调用服务器API的一个工具,如果很多API接口,可以考虑使用,如果只是一两个,没必要搞那么复杂。
Retrofit简介相关推荐
- Retrofit的网络框架介绍
Retrofit简介 Retrofit是square开源的网络请求库,底层是使用OKHttp封装的,网络请求速度很快. 主要有一下几种请求方法 格式 含义 @GET 表示这是一个GET请求 @POST ...
- Retrofit教程
(源码教程): https://www.jianshu.com/p/0c055ad46b6c 正文 Retrofit简介 Rrotrofit是一个RESTful架构的HTTP网络请求框 ...
- android开发笔记之Retrofit
Retrofit 简介 A type-safe HTTP client for Android and Java 在Android网络请求库中,Retrofit是当下最热的一个网络请求库. 建议在使用 ...
- 网络请求(三)— Retrofit
1 Retrofit简介 A type-safe HTTP client for Android and Java Retrofit是一个网络请求框架的封装,底层网络请求默认使用OkHttp,也就是说 ...
- Retrofit的使用方法
Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传 https://www.jianshu.com/p/acfefb0a204f https://www.jianshu. ...
- 一套完整的Android通用框架
现在做Android开发,已经是大好时机,网上有很多成熟的框架,我们应充分利用好这些,所谓前人种树后人好乘凉,很多时候压根不需要了解太多原理,只需站在巨人的丁丁上即可,当然您说您能力强,非要重复造轮子 ...
- Android优秀开源框架集
Android优秀开源框架介绍 开篇 网络请求框架 1. okhttp 2. retrofit 3. android-async-http android图表框架 4. MPAndroidChart ...
- Retrofit2.0带你装逼,带你飞
Retrofit2.0上手操作 retrofit简介 retrofit使用 retrofit简介 Retrofit是一款基于OKHttp的restful的网络请求框架.支持异步和同步请求,看到异步有么 ...
- Retrofit使用简介
Retrofit Retrofit是一个整合的Http网络请求框架封装. 1.简单使用Restrofit 1.1 在gradle文件中添加依赖 compile 'com.squareup.retrof ...
最新文章
- WMI技术介绍和应用——Event Provider
- linux非阻塞的socket EAGAIN的错误处理【转】
- mysql的告警日志_运维日记|MySQL关于aborted告警日志的分析
- logisticregression参数_通俗地说逻辑回归【Logistic regression】算法(二)sklearn逻辑回归实战...
- vmvare连接linux
- 95-138-010-源码-Function-ReduceFunction
- 95-180-040-源码-Watermark-简介
- 解决Spring JdbcTemplate调用queryForObject()方法结果集为空时报异常
- 有机农业产品宣传介绍PPT模板
- Python tkinter 设置主题
- topojson转换与应用
- 著名的斐波那契额数列,1 1 2 3 5 8输出第n项
- Android允许应用具有安装权限
- js前端double无法显示,long精度丢失,layUI数据表格
- oracle 数据泵 network link使用
- 给textView设置文字渐变色
- 腾讯云4核8g服务器支持多少人在线使用?
- 小程序onReachBottom不触发
- 大数据多样性体现在包括_书摘:复杂的证据定位:电子数据的多样性
- 【无限互联】iOS开发视频教程—1.iPhone开发概述——必看