Retrofit 基础+详解

基础:

1、什么是retrofit

    retrofit是网络请求框架,可以理解为okHttp的加强版,底层封装了OKhttp。准确的是Retrofit是一个restful的http网络请求框架封装。因为网络请求工作本质上是pkhttp来完成,而retorfit负责网络请求接口的封装

2、Retorfit的优点

超级解偶,接口定义、接口参数、接口回调不在耦合在一起
可以配置不通的httpClient来实现网络请求,如okhttp、httpclient
支持同步、异步、Rxjava
可以配置不同反序列化工具类来解析不同的数据,如json、xml
请求速度快,使用方便灵活简洁

注解

   Retorfit使用大量注解来简化请求,Retrofit讲okhttp请求抽象成java接口,使用注解来配置和描述网络请求参数,大概分为以下几类

1、请求方法注释

请求方法注解说明        
@GETget请求
@POSTpost请求
@PUTput请求
@DELETEdelete请求
@PATCHpatch请求
@HEADhead请求
@OPTIONSoptions请求
@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){}

});

 

 

 



 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值