提到Rtrofit和Okhttp就不得不说到square团队,这是一个非常优秀的团队,其团队奉献了不少优秀的开源库。目前Rtrofit和Okhttp可以说是android网络框架中的明星,其使用简便和配合解耦度高使得它们成为了android程序员们的最爱,目前使用的Rtrofit为2.0以后的版本。
Retrofit官网
Square团队的github地址
1、@GET GET网络请求方式
2、@POST POST网络请求方式
3、@Headers()头信息参数
4、@Path() 路径参数,替换url地址中{ }所括的部分
5、@Query() 查询参数,将在url地址中追加类似“page=1”的字符串,形成提交给服务端的请求参数
6、@QueryMap查询参数集合,将在url地址中追加类似“type=text&username=abc&password=123”的字符串
7、@FormUrlEncoded对表单域中填写的内容进行编码处理,避免乱码
8、@Field() 指定form表单域中每个空间的额name以及相应的数值
9、@FieldMap表单域集合
10、@Multipart Post提交分块请求,如果上传文件,必须指定Multipart
11、@Body Post提交分块请求
注意:大部分注解都可固定或动态改变来做网络请求
一、添加依赖
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
compile 'com.squareup.okhttp3:okhttp:3.8.1'
二、构建Okhttp对象(该对象可以设置超时时间和代理模式及很多其他配置,也体现了okhttp和retrofit配合使用的优势)
OkHttpClient OK_HTTP_CLIENT = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.build();
三、初始化Retrofit对象
//获取Retrofit对象,设置地址
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://localhost")
.client(OK_HTTP_CLIENT)
.build();
四、初始化Rtrofit请求接口
public interface RequestServices {
@GET //定义返回的方法,返回的响应体使用了ResponseBody
Call getString(@Url String url);
@FormUrlEncoded
@POST
Call post(@Url String url, @FieldMap Map params);
}
五、构造请求体进行网络请求
(1)Get方式请求
RequestServices requestServices = retrofit.create(RequestServices.class);//RequestServices为上一步中的Rtrofit请求接口
Call call = requestServices.getString("http://www.baidu.com");
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if (response.isSuccessful()){
try {
//请求成功后的回调
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onFailure(Call call, Throwable t) {
//请求失败后的回调
}
});
(2)Post方式请求
RequestServices requestServices = retrofit.create(RequestServices.class);
Map pamars = new HashMap<>();
pamars.put("location","成都");
pamars.put("key","这里是我的和风天气key就不透露了");
Call call = requestServices.post("https://free-api.heweather.com/s6/weather?parameters",pamars);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if (response.isSuccessful()){
try {
//请求成功后的回调
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onFailure(Call call, Throwable t) {
//请求失败后的回调
}
});
温馨提示:android网络请求返回结果多为Json格式,推荐使用谷歌开源库Gson来进行解析,使用较为简便。
方法一
Retrofit retrofit = Retrofit.Builder()
.baseUrl("https://your.api.url/");
.build();
UserService service = retrofit.create(UserService.class);
service.profilePicture("https://s3.amazon.com/profile-picture/path");
//请求地址则为 https://s3.amazon.com/profile-picture/path
方法二
Retrofit retrofit = Retrofit.Builder()
.baseUrl("https://your.api.url/");
.build();
UserService service = retrofit.create(UserService.class);
service.profilePicture("profile-picture/path");
// 请求地址则为 https://your.api.url/profile-picture/path
方法三
Retrofit retrofit = Retrofit.Builder()
.baseUrl("https://your.api.url/v2/");
.build();
UserService service = retrofit.create(UserService.class);
service.profilePicture("/profile-picture/path");
//请求地址则为 https://your.api.url/profile-picture/path
该部分借鉴于CSDN某大神 其文章地址
Retrofit的注解机制可以说是Retrofit的核心部分,利用注解来简化代码,便于理解。
固定头
interface SomeService {
@GET("/some/endpoint")
@Headers("Accept-Encoding: application/json")
Call someEndpoint();
}
someService.someEndpoint();
// GET /some/endpoint HTTP/1.1
// Accept-Encoding: application/json
动态头
interface SomeService {
@GET("/some/endpoint")
Call someEndpoint(
@Header("Location") String location);
}
someService.someEndpoint("Droidcon NYC 2015");
// GET /some/endpoint HTTP/1.1
// Location: Droidcon NYC 2015
固定头+动态头
interface SomeService {
@GET("/some/endpoint")
@Headers("Accept-Encoding: application/json")
Call someEndpoint(
@Header("Location") String location);
}
someService.someEndpoint("Droidcon NYC 2015");
// GET /some/endpoint HTTP/1.1
// Accept-Encoding: application/json
// Location: Droidcon NYC 2015
无body的post请求
interface SomeService {
@POST("/some/endpoint")
Call someEndpoint();
}
someService.someEndpoint();
// POST /some/endpoint?fixed=query HTTP/1.1
// Content-Length: 0
有body的post请求
interface SomeService {
@POST("/some/endpoint")
Call someEndpoint(
@Body SomeRequest body);
}
someService.someEndpoint();
// POST /some/endpoint HTTP/1.1
// Content-Length: 3
// Content-Type: greeting
//
// Hi!
这里只简单列举了几个方法,其余注解使用方法大致相似,就不再列举
(1)超级解耦合
(2)使用简便
(3)配合okhttp后可满足不同使用需求
(4)支持同步和异步请求(可配合Rxjava)
(5)响应式编程模式