基础:
1、什么是retrofit
retrofit是网络请求框架,可以理解为okHttp的加强版,底层封装了OKhttp。准确的是Retrofit是一个restful的http网络请求框架封装。因为网络请求工作本质上是pkhttp来完成,而retorfit负责网络请求接口的封装
2、Retorfit的优点
超级解偶,接口定义、接口参数、接口回调不在耦合在一起
可以配置不通的httpClient来实现网络请求,如okhttp、httpclient
支持同步、异步、Rxjava
可以配置不同反序列化工具类来解析不同的数据,如json、xml
请求速度快,使用方便灵活简洁
注解
Retorfit使用大量注解来简化请求,Retrofit讲okhttp请求抽象成java接口,使用注解来配置和描述网络请求参数,大概分为以下几类
1、请求方法注释
请求方法注解 | 说明 |
---|---|
@GET | get请求 |
@POST | post请求 |
@PUT | put请求 |
@DELETE | delete请求 |
@PATCH | patch请求 |
@HEAD | head请求 |
@OPTIONS | options请求 |
@HTTP | 通过注释可以替换以上所有注释,它拥有三个属性:method、path、hasBady |
2、请求头注解
请求头注解 | 说明 |
---|---|
@Headers | 用于添加固定请求头,可以同时添加多个,通过该注解的请求头不会相互覆盖,而是共同存在 |
@Header | 作为方法的参数传入,用于添加不固定的header,它会更新已有请求头 |
3、请求参数注解
请求参数注解 | 说明 |
---|---|
@Body | 多用于post请求发送非表达数据,根据转换方式将实例对象转换为对应字符串传参参数,比如使用Post发送json数据,添加GsonConverterFactory则是将body转换为json字符串进行传递 |
@Filed | 多用于Post方式传递参数,需要结合@FromUrlEncoded使用,即以表单的形式传递参数 |
@FiledMap | 多用于Post请求中的表单字段,需要集合@FromUrlEncoded使用 |
@Part | 多用于表单字段,Part和PartMap与@multipart注解结合使用,适合文件上传的情况 |
@PartMap | 用于表单字段,默认接受类型时Map<String, RequestBody>,可用于实现多文件上传 |
@Path | 用于Url中的占位符 |
@Query | 用于Get请求中的参数 |
@QueryMap | 与Query类似,用于不确定表单参数 |
@Url | 指定请求路径 |
4、请求和相应格式(标记)注解
标记累注解 | 说明 |
---|---|
@FromUrlCoded | 表示请求发送编码表单数据,每个键值对需要使用@Filed注解 |
@Multipart | 表示请求发送from_encoded数据(使用于有文件上传的场景),每个键值对需要用@Part来注解键名,随后的对象需要提供之 |
@Streaming | 表示想用用于字节流的形式返回,如果没有使用注释,默认会把数据全部载入到内存中,该注解在下载大文件时特别有用 |
Retrofit的使用
1、注释详解
注:接口中的每个方法的参数都需要用注解标记,否则会报错
1)@GET、@Query 、 @QueryMap的使用
//无参数get请求
public interface Api {
//get 请求
@GET("user")
Call<ResponseBody> getData();
}
//@GET 请求方法注解,get请求,括号内是请求地址,url的一部分
//Call<*> 返回类型,*表示机接口数据的类,一般自定义,可以订阅网络请求返回值未Call<ResponseBody>,ResponseBody是网络请求返回的原始数据
//getData() 接口方法名称,括号内可以写入参数
//这是网络接口最简单的一种形式: 这是一个没有网络参数的get请求,需要我们在头部添加@GET注解,表示
//采用get方法访问网络请求,
有参数get请求
@GET("user")
Call<ResponseBody> getData(@Query("id") long idLon,@Query("name") String name)
@Query 请求参数注解,用于get请求中的参数
"id"、"name" 参数字段,与后台给的字段需要一致
long、String 声明的参数类型
idLon、name 实际参数
有参数Get请求 参数Map
@GET("user")
Call<ResponseBody> getData(@QueryMap Map<String, Object> map)
@QueryMap 请求参数注解。与@Query类似,用于不确定表单参数
Map<String, Object> map 通过Map将不确定的参数传入,相当于多个Query参数
//实例
Map<String, Object> map = new HashMap<>();
map.put("id", 10000);
map.put("name", "名字")
Call<ResponseBody> call = retrofit.create(Api.class).getData(map)
2) @POST、@FormUrlEncoded、@File、@FileMap、@Body的使用
无参数post请求
@POST("user/emails")
Call<ResponseBody> getPostData();
.@POST 请求方法注解,表示采用post方法访问网络请求,括号后面是部分URL地址
有参数post请求
@FormUrlEncoded
@POST("user/emails")
Call<ResponseBody> getPostData(@Field("name") String nameStr,@Field("sex") String sexStr)
.@FormUrlEncoded 请求格式注解,请求实体是一个From表单,每个键值对需要使用@Field注解
.@Field 请求参数注解,提交请求的表单字段,必须要添加,而且需要配合@FromUrlEncoded使用
Post请求如果需要在头部添加@FromUrlEncoded注解,表示请求实体是一个From表单,每个键值对都需要使用@Filed注解,使用@Filed添加参数,这是发送Post请求时,提交请求的表单字段,必须要添加,而且需要配合@FromUrlEncoded使用
//Map
@FormUrlEncoded
@POST("user/emails")
Call<ResponseBody> getPostData(@FieldMap Map<String, Object> map);
Map<String, Object> fieldMap = new HashMap<>();
fieldMap.put("name","名字");
firldMap.put("sex","性别");
Call<ResponseBody> postData = retrofit.create(Api.class).getPostData(fieldMap);
.@FieldMap 请求参数注解,与Field作用一致,用于不确定表单参数
使用于Post请求的还有一个注解@Body,@Body可以传递自定义类型数据给服务器,多用于post请求发送非表单数据,比如用传递json格式数据、hashMap、实体类等等
@POST("user/emails")
Call<ResponseBody> getPostBody(@Body RequeryBody body);
.@Body 上传json格式数据,直接传入实体他会自动转json,这个转换方式是GsonConverterFactory定义的
注:@Body注释不能用于表单或者支持文件上传的表单的编码,即不能与@FormUrlEncoded和@Multipart注解同时使用,否则会报错
@HTTP
@HTTP注解的作用是替换@GET、@POST、@PUT、@DELETE、@HEAD以及更多拓展功能
@HTTP(method = "GET", path="user/keys", hasBody = false)
Call<ResponseBody> getHttpData()
method 表示请求的方法,区分大小写,这里的值retrofit不做任何处理,必须保证正确
path 网络请求地址路径
hasBody 是否有请求体,boolean类型
@Path
@GET("orgs/{id}")
Call<ResponseBody> getPathData(@Query("name") String nameStr, @Path("id") long idLon);
.@Path 请求参数注解,用于Url中的占位符{},所有的网址中的参数
如:
上面@GET("orgs/{id})的id,通过{}占位符来标记id,使用@Path注解传入的idLon的值
@Url
如果需要重新地址接口地址,可以用@Url,将地址以参数的形式传入
@GET
Call<ResponseBody> getUrlData(@Url String url,@Query("id") long idLon);
.@Url 表示指定请求路径,可以当做参数传入
@Header、@Headers
我们可以在方法参数添加请求头,@Hearder用于添加不固定请求头,作用于方法的参数,作为方法的参数传入,该注解会更新已有的请求头
@GET("user/emails")
Call<RespnseBody> getHeaderData(@Header("token") String token);
.@Header 请求头注解,用于添加不固定请求头
@headers用于添加固定请求头,作用于方法,可以同时添加多个,通过该注解添加的请求头部会相互覆盖,而且共同存在
@Headers({"phone-type:android", "version:1.1.1"})
@GET("user/emails")
Call<ResponseBody> getHeadersData();
.@Headers 请求头注解,用于添加固定请求头,可以添加多个
@Streaming
@Streaming
@POST("gists/public")
Call<ResponseBody> getStreamingBig();
.@Streaming 表示响应体的数据用流的方式返回,使用于返回数据比较大,该注解在下载大文件时特别有用
@Multipart、@Part、@PartMap
@Multipart
@POST("user/followers")
Call<ResponseBody> getPartData(@Part("name") ResponseBody name,@Part MultipartBody.Part file);
.@Multipart 表示请求实体是一个支持文件上传的表单,需配合@Part和@PartMap使用,适用于文件上传
.@Part 用于表单字段,适用于文件上传情况,@Part支持三种类型:RequestBody、MultipartBody.part、任意类型
.@PartMap 用于多文件上传,与@FieldMap和@QueryMap使用相似
@Multipart
@POST("user/followers")
Call<ResponseBody> getPartMapData(@PartMap Map(String, MultipartBody.Part) map)
使用
File file1 = new File("文件路径1");
File file2 = new File("文件路径2");
if(!file1.exists()){
file1.mkdir();
}
if(!file2.exists()){
file2.mkdir();
}
RequestBody requestBody1 = RequestBody.create(MediaType.parse("image/png"), file1);
RequestBody requestBody2 = RequestBody.create(MediaType.parse("image/png"), file2);
MultipartBody.Part filePart1 = MultipartBody.Part.creatteFro,Data("file1",file1.getName(),requestBody1);
MultipartBody.Part filePart2 = MultipartBody.Part.creatteFro,Data("file2",file2.getName(),requestBody2);
Map<String, MultipartBody.Part> mapPart = new HashMap<>();
mapPart.put("file1",filePart1);
mapPart.put("file2", fliePart2);
Call<ResponseBody> partMapDataCall = retorfit.create(Api.class).getPartMapData(mapPart);
retorfit在项目中的简单使用
1、添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
2、添加依赖库
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
3、创建数据实体类
public class Data<T> {
private int code;
private String message;
private T data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
4、创建用于描述网络接口的类
public interface Api {
@GET
Call<Data<Info>> getJsonData(@Query("sort") String sort, @Query("format") String fromat)
}
5、创建Retrofit实体类
//构建Retrofit实体
Retrofit retorfit = new Retorfit.Builder()
//设置网络请求的baseUrl地址
.baseUrl("https://api.uomg.com/")
//设置解析器
.addConverterFactory(GsonCoverterFactory.create())
.build();
注: baseUrl地址必须以"/"结尾,否则会报错
添加包依赖
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
6、创建网络请求接口实例
//创建网络请求接口对象实例
Api api = mPetrofit.create(Api.class);
//对发送请求进行封装
Call<Data<Info>> dataCall = api.getJsonData("性格帮","json")
7、发送网络请求(同步/异步)
//异步
dataCall.enqueue(new CallBack<Data<Info>>(){
//请求成功回调
@Override
public void onResponse(Call<Data<Info>> call, Response<Data<Info>> response){}
//请求失败回调
@Override
public void onFailure(Call<Data<Info>> call, Throwable t){}
});
//同步
Response<Data<Info>> data = dataCall.execute();
post请求的简单使用
Public interface Api {
//post请求,如果有参数需要添加@FormUrlEncoded注解,即和@Field配合使用
@FormUrlEncoded
@POST("api/comments.163")
Call<Object> postDataCall(@Field("Format") String fromat);
}
调用
Retorfit retorfit = new Retorfir.Build()
.baseUrl("http://api.uomg.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
Api reqiest = retrofit.create(Api.class);
Call<Translation> call = rerquest.postDataCall("JSON");
call.enqueue(new CallBack<Translation>() {
//请求成功
@Override
public void onResponse(Call<Translation> call, Response<Trainlation> rersponse){}
//请求失败
@Override
public void onFailure(Call<Translation> call,Throwable throwable){}
});