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简介相关推荐

  1. Retrofit的网络框架介绍

    Retrofit简介 Retrofit是square开源的网络请求库,底层是使用OKHttp封装的,网络请求速度很快. 主要有一下几种请求方法 格式 含义 @GET 表示这是一个GET请求 @POST ...

  2. Retrofit教程

    (源码教程): https://www.jianshu.com/p/0c055ad46b6c 正文 Retrofit简介         Rrotrofit是一个RESTful架构的HTTP网络请求框 ...

  3. android开发笔记之Retrofit

    Retrofit 简介 A type-safe HTTP client for Android and Java 在Android网络请求库中,Retrofit是当下最热的一个网络请求库. 建议在使用 ...

  4. 网络请求(三)— Retrofit

    1 Retrofit简介 A type-safe HTTP client for Android and Java Retrofit是一个网络请求框架的封装,底层网络请求默认使用OkHttp,也就是说 ...

  5. Retrofit的使用方法

    Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传 https://www.jianshu.com/p/acfefb0a204f https://www.jianshu. ...

  6. 一套完整的Android通用框架

    现在做Android开发,已经是大好时机,网上有很多成熟的框架,我们应充分利用好这些,所谓前人种树后人好乘凉,很多时候压根不需要了解太多原理,只需站在巨人的丁丁上即可,当然您说您能力强,非要重复造轮子 ...

  7. Android优秀开源框架集

    Android优秀开源框架介绍 开篇 网络请求框架 1. okhttp 2. retrofit 3. android-async-http android图表框架 4. MPAndroidChart ...

  8. Retrofit2.0带你装逼,带你飞

    Retrofit2.0上手操作 retrofit简介 retrofit使用 retrofit简介 Retrofit是一款基于OKHttp的restful的网络请求框架.支持异步和同步请求,看到异步有么 ...

  9. Retrofit使用简介

    Retrofit Retrofit是一个整合的Http网络请求框架封装. 1.简单使用Restrofit 1.1 在gradle文件中添加依赖 compile 'com.squareup.retrof ...

最新文章

  1. WMI技术介绍和应用——Event Provider
  2. linux非阻塞的socket EAGAIN的错误处理【转】
  3. mysql的告警日志_运维日记|MySQL关于aborted告警日志的分析
  4. logisticregression参数_通俗地说逻辑回归【Logistic regression】算法(二)sklearn逻辑回归实战...
  5. vmvare连接linux
  6. 95-138-010-源码-Function-ReduceFunction
  7. 95-180-040-源码-Watermark-简介
  8. 解决Spring JdbcTemplate调用queryForObject()方法结果集为空时报异常
  9. 有机农业产品宣传介绍PPT模板
  10. Python tkinter 设置主题
  11. topojson转换与应用
  12. 著名的斐波那契额数列,1 1 2 3 5 8输出第n项
  13. Android允许应用具有安装权限
  14. js前端double无法显示,long精度丢失,layUI数据表格
  15. oracle 数据泵 network link使用
  16. 给textView设置文字渐变色
  17. 腾讯云4核8g服务器支持多少人在线使用?
  18. 小程序onReachBottom不触发
  19. 大数据多样性体现在包括_书摘:复杂的证据定位:电子数据的多样性
  20. 【无限互联】iOS开发视频教程—1.iPhone开发概述——必看

热门文章

  1. ToolBar 修改菜单字体和颜色
  2. PPT模板哪里来——02
  3. 小米笔记本2020版云测评
  4. WPF打开摄像头拍照
  5. 塔望食业洞察|预制菜行业市场现状、发展趋势及未来思考
  6. H5总结(慢慢自我总结)
  7. 中国电信天翼开放平台全面释放开放合作
  8. brpc-client
  9. 【XLA】一、【构图阶段】图优化器的注册和执行
  10. 站长号文库:什么是云存储?