网站首页 > 技术文章 正文
前言
在项目开发中,后端会经常去请求一些已经开发好的服务接口获取数据。直接使用okhttp、httpClient发起http请求,既繁琐又不方便统一管理。在这里推荐一个适用于Spring Boot项目的轻量级HTTP客户端框架retrofit,使用非常简单方便。retrofit是一款类型安全的HTTP客户端,其最大的特性的是支持通过接口的方式发起HTTP请求 。
准备
使用前期讲到的Spring Boot可视化接口开发工具magic-api部署两个http服务接口,不知道可视化接口开发工具的可以翻看前期的文章,这里不再过多说明。
get接口
http://127.0.0.1:9999/user/select?id=15
post接口
http://127.0.0.1:9999/user/update
{
"id":15,
"name": "九天银河聊编程",
"age": 35,
"address": "天津"
}
retrofit开发
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
配置文件
server:
port: 8080
retrofit:
global-log:
enable: true
log-level: info
HttpClient:
BaseUrl: "http://127.0.0.1:9999/"
编写参数实体
根据接口的输入参数编写相关实体,代码略!
http接口定义
@RetrofitClient(baseUrl = "${HttpClient.BaseUrl}")
public interface Api {
@GET("user/select")
Result1 getUser(@Query("id") Integer id);
@POST("user/update")
Result2 updateUser(@Body User user);
}
使用
@RestController
@RequestMapping("user/")
public class RetrofitController {
@Autowired
private Api api;
@GetMapping("/select")
public User[] select() {
Result1 result = api.getUser(15);
return result.getData();
}
@GetMapping("/update")
public String update() {
User user = new User();
user.setId(15);
user.setAge(35);
user.setName("九天银河聊编程");
user.setAddress("天津");
Result2 result = api.updateUser(user);
return result.getData();
}
}
调用服务
控制台输出:
控制台输出:
大功告成,是不是很简单?
常用注解说明
方法注解
@GET | GET请求 |
@POST | POST请求 |
@HTTP | 作用于方法,用于发送一个 自定义的HTTP请求 |
标记注解
@FormUrlEncoded
请求体是 From 表单 @POST比起@GET多了一个@FromUrlEncoded的注解。
@Multipart
请求体是支持文件上传的 From 表单
@Streaming
响应体的数据用流的形式返回,未使用该注解,默认会把数据全部载入内存,之后通过流获取数据也是读取内存中数据,所以返回数据较大时,需要使用该注解。
参数注解
@Query
用于Get请求数据,用于拼接在拼接在Url路径后面的查询参数,一个@Query相当于拼接一个参数,多个参数中间用,隔开
@Body
非表单请求体,是结合post请求的
@Field
表单字段,@Field的用法类似于@Query,不同的是@Field主要用于Post请求数据。
@Part
表单字段,与 PartMap 配合,适合文件上传情况
@PartMap
表单字段,与 Part 配合,适合文件上传情况;默认接受 Map<String, RequestBody> 类型,非 RequestBody 会通过 Converter 转换
其它注解
@Url
@Url是动态的Url请求数据的注解。需要注意的是使用@Url时,path对应的路径不能包含”/”,不然每个加到host Url后面的东西都会被省略掉。千万注意了
@Path
@Path主要用于Get请求,用于替换Url路径中的变量字符。
踩坑记录
当POST请求时,@FormUrlEncoded和@Field简单的表单键值对。两个需要结合使用,否则会报错。
其它调用例子
RestFul方式请求
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
map作为请求体
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
表单提交
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
Multipart请求
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
高级应用
注解式拦截器
对http请求执行统一的拦截处理逻辑,基于url路径的匹配拦截 。使用的步骤主要分为2步:
- 继承BasePathMatchInterceptor编写拦截处理器;
- 接口上使用@Intercept进行标注。如需配置多个拦截器,在接口上标注多个@Intercept注解即可!
扩展注解式拦截器
对拦截注解动态传入一些参数,然后再执行拦截的时候需要使用这个参数。自定义拦截注解必须使用@InterceptMark标记,并且注解中必须包括include()、exclude()、handler()属性信息 。使用的步骤主要分为3步:
- 自定义拦截注解
- 继承BasePathMatchInterceptor编写拦截处理器
- 接口上使用自定义拦截注解;
例如我们需要在请求头里面动态加入accessKeyId、accessKeySecret签名信息才能正常发起http请求 ,这个时候可以自定义一个加签拦截器注解@Sign来实现
请求重试
在接口或者方法上加上@Retry注解即可。@Retry支持重试次数maxRetries、重试时间间隔intervalMs以及重试规则retryRules配置
错误解码器
在HTTP发生请求错误(包括发生异常或者响应数据不符合预期)的时候,错误解码器可将HTTP相关信息解码到自定义异常中。你可以在@RetrofitClient注解的errorDecoder()指定当前接口的错误解码器,自定义错误解码器需要实现ErrorDecoder接口。
每天一个小知识,每天进步一点点!!![加油][加油][加油]
猜你喜欢
- 2024-09-30 SpringCloud 远程调用为啥要采用HTTP,而不是RPC?
- 2024-09-30 PRA10.3平台API接口调用 api接口调用教程
- 2024-09-30 程序员2022年你不懂RPC远程过程调用,RPC框架的话真的要被淘汰了
- 2024-09-30 Spring Cloud Gateway一次请求调用源码解析
- 2024-09-30 Go教程34:Go微服务间Http+Json调用
- 2024-09-30 接口测试:A13_HttpRunner_hook_01_钩子机制及用例层面的调用
- 2024-09-30 Spring 框架里的 HTTP 调用,RestTemplate 还是 WebClient
- 2024-09-30 HarmonyOS如何调用http/https接口?
- 2024-09-30 Feign : 优雅的调用 API 调用feign接口
- 2024-09-30 远程调用中,rpc到底比http好在哪里
你 发表评论:
欢迎- 13℃一般人不敢动系列之—基于logback的日志“规范”和“脱敏”
- 12℃MybatisPlus保姆级学习笔记(四)条件构造器Wrapper方法详解
- 12℃Spring Boot 2.5.0 发布:支持Java16、Gradle 7、Datasource调整
- 11℃聊聊:Mybatis-Plus 新增获取自增列id,这一次帮你总结好
- 10℃Web前端培训:Python与JavaScript — 哪一种最适合Web开发
- 10℃MybatisPlus介绍以及整合SpringBoot
- 10℃MyBatis-Plus自动填充新增更新时间
- 9℃「Java工具类」Apache的DigestUtils加密工具类和Base64加解密类
- 0℃未命名
- 最近发表
-
- springboot整合easyexcel实现Excel导出
- JAVA 按Excel模板导出Excel文件之 Jxls
- Java导出excel java导出Excel的三种方法
- java大牛告诉你这样导出excel更加简单高效
- Java:java五行代码实现Excel的快速导出
- Spring Boot整合EasyExcel实现对于Excel文件导出?
- 一文搞定!EasyExcel实现文件导入导出,简单实用又高效
- 程序员:超级简单导出Excel 工具,Hutool Java工具类库
- 「SpringCloud」(三十)整合EasyExcel实现数据表格导入导出功能
- Hutool Java工具类库导出Excel,超级简单
- 标签列表
-
- mybatis返回int (51)
- jsonproperty注解无效 (52)
- jtextfield (48)
- flaskrequest.data (53)
- preflight请求 (48)
- request.getheader (57)
- pomexclusion (55)
- javassh连接远程服务器 (80)
- java-jar输出日志 (71)
- mybatis.type-aliases-package (63)
- arraystoreexception (56)
- 线程池submit (67)
- sshshell (49)
- vue2props (57)
- 微信小程序form表单提交 (55)
- javabase64转图片 (55)
- javaobject转map (74)
- java接口文档生成工具 (49)
- tcpflags (59)
- 虚拟机共享文件夹在哪 (60)
- shiro设置session过期时间 (61)
- python-msimpleserver (48)
- bufferedreader.readline() (48)
- map转list对象 (50)
- resttemplate文件上传 (57)
本文暂时没有评论,来添加一个吧(●'◡'●)