Retrofit-android三方框架

Retrofit-android三方框架

一、简述

retrofit是现在比较流行的网络请求框架,可以理解为okhttp的加强版,底层封装了Okhttp。准确来说,Retrofit是一个RESTful的http网络请求框架的封装。因为网络请求工作本质上是由okhttp来完成,而Retrofit负责网络请求接口的封装。 Retrofit使用大量注解来简化请求,Retrofit将okhttp请求抽象成java接口,使用注解来配置和描述网络请求参数。大概可以分为以下几类,我们先来看看各个注解的含义,再一一去实践解释。

请求方法注解

注解语法对应语义
@GETget请求
@POSTpost请求
@PUTput请求
@DELETEdelete请求
@PATCHpatch请求,该请求是对put请求的补充,用于更新局部资源
@HEADhead请求
@OPTIONSoptions请求
@HTTP通过注解,可以替换以上所有的注解,它拥有三个属性:method、path、hasBody

请求头注解

注解语法对应语义
@Headers用于添加固定请求头,可以同时添加多个,通过该注解的请求头不会相互覆盖,而是共同存在
@Header作为方法的参数传入,用于添加不固定的header,它会更新已有请求头

请求参数注解

注解语法对应语义
@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指定请求路径

请求和响应格式(标记)注解

注解语法对应语义
@FromUrlCoded表示请求发送编码表单数据,每个键值对需要使用@Filed注解
@Multipart表示请求发送form_encoded数据(使用于有文件上传的场景),每个键值对需要用@Part来注解键名,随后的对象需要提供值
@Streaming表示响应用字节流的形式返回,如果没有使用注解,默认会把数据全部载入到内存中,该注解在下载大文件时特别有用

使用

简单请求举例

1.无参请求

public interface Api {
    //get请求
    @GET("user")   //@GET 请求方法注解,get请求,括号内的是请求地址,Url的一部分
    Call<ResponseBody> getData();//Call<*>返回类型,*表示接收数据的类DataBean,getData()接口方法名称,括号内可以写入参数
}

这里特别说明Url的组成,retrofit把网络请求的Url分成两部分设置:第一部分在创建Retrofit实例时通过.baseUrl()设置,第二部分在网络接口注解中设置,比如上面接口的"/user"。
网络请求的完整地址Url = Retrofit实例.baseUrl()+网络请求接口注解()
(后面举例)

2 已知有参请求

 @GET("user")
 Call<ResponseBody> getData2(@Query("id") long idLon, @Query("name") String nameStr);

这里先来看,假设我们在百度上要下载一张高清图片,然后我们点击下载。观察网址:

https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=高清图片下载&step_word=&hs=0&pn=0&spn=0&di=7163459808555696129&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=1568112264%2C131746964&os=6800435%2C3489889301&simid=4142889121%2C661726774&adpicid=0&lpn=0&ln=1647&fr=&fmq=1676097152334_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=15&oriquery=&objurl=https%3A%2F%2Ft1.niutuku.com%2F960%2F23%2F23-477522.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fgt7p7h7_z%26e3Bv54AzdH3FktzitAzdH3FnbdlAzdH3F90bdbc_z%26e3Bfip4s&gsm=1e&rpstart=0&rpnum=0&islist=&querylist=&nojc=undefined&dyTabStr=MCwzLDEsNiw0LDIsNSw3LDgsOQ%3D%3D

这里面有很多,我们截取一点来看

https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=高清图片下载

看到这里,看后面有成对的ct=503316480和z=0和ipn=d,就明白了,就是一种简单的键值对方式,再简单一点就是:下载图片的时候你需要告诉百度,下多大尺寸的,分辨率多少的,下载什么格式的,然后一一对照填他所需要的参数就可以了。

回到上面的代码:

 @GET("user")
 Call<ResponseBody> getData2(@Query("id") long idLon, @Query("name") String nameStr);

这就可以理解为想要返回ResponseBody这种类型的数据需要再baseUrl后面先拼接user,然后在请求方法getData2中要求第一个参数传入long类型,对应id,第二个参数闯入String类型,对应name,于是,就变成了

https://xxxxxx.com/user?id=idLon&name=nameStr//当然这个需要看具体的请求,这个只是随手写的

3.未知有参请求
如果有不确定的把表单参数我们可以使用@QueryMap注解来添加参数,通过Map将不确定的参数存入,然后在方法体中带给网络接口,相当于多个Query参数,看看下面的使用:

 @GET("user")
 Call<ResponseBody> getData3(@QueryMap Map<String, Object> map);
  Map<String, Object> map = new HashMap<>();
  map.put("id", 10006);
  map.put("name", "刘亦菲");
 
  Call<ResponseBody> call = retrofit.create(Api.class).getData3(map);

对于上面列表中列举的请求头,参数等有很多用法,按需索取,这里不一一举例,可以参考:retrofit详解

参考文章

retrofit详解这位大哥写的很清楚,挺好哈哈哈哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
retrofit-spring-boot-starter是一个用于整合Retrofit库和Spring Boot的starter项目,它可以简化在Spring Boot中使用Retrofit的配置和使用。 以下是retrofit-spring-boot-starter的使用方法: 1. 在你的Spring Boot项目的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.github.lianjiatech</groupId> <artifactId>retrofit-spring-boot-starter</artifactId> <version>1.0.0</version> </dependency> ``` 2. 创建一个接口,用于定义Retrofit的API接口。例如: ```java import retrofit2.http.GET; import retrofit2.http.Path; public interface MyApi { @GET("/users/{username}") User getUser(@Path("username") String username); } ``` 3. 在你的Spring Boot应用程序中,使用`@Autowired`注解将Retrofit的API接口注入到你的代码中。例如: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import retrofit2.Retrofit; @Service public class MyService { private final MyApi myApi; @Autowired public MyService(Retrofit retrofit) { this.myApi = retrofit.create(MyApi.class); } public User getUser(String username) { return myApi.getUser(username); } } ``` 4. 现在你可以在你的代码中使用`MyService`来调用Retrofit的API接口了。例如: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { private final MyService myService; @Autowired public MyController(MyService myService) { this.myService = myService; } @GetMapping("/users/{username}") public User getUser(@PathVariable String username) { return myService.getUser(username); } } ``` 以上是retrofit-spring-boot-starter的基本用法。你可以根据自己的需求进行配置和使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值