Spring Boot调用Http接口的简单方法

开发 架构
在这里推荐一个适用于Spring Boot项目的轻量级HTTP客户端框架Retrofit,使用非常简单方便。Retrofit是一款类型安全的HTTP客户端,其最大的特性的是支持通过接口的方式发起HTTP请求 。

前言

在项目开发中,后端会经常去请求一些已经开发好的服务接口获取数据。直接使用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步:

  1. 继承BasePathMatchInterceptor编写拦截处理器;
  2. 接口上使用@Intercept进行标注。如需配置多个拦截器,在接口上标注多个@Intercept注解即可!

扩展注解式拦截器

拦截注解动态传入一些参数,然后再执行拦截的时候需要使用这个参数。自定义拦截注解必须使用@InterceptMark标记,并且注解中必须包括include()、exclude()、handler()属性信息 。使用的步骤主要分为3步:

  1. 自定义拦截注解
  2. 继承BasePathMatchInterceptor编写拦截处理器
  3. 接口上使用自定义拦截注解;

例如我们需要在请求头里面动态加入accessKeyId、accessKeySecret签名信息才能正常发起http请求 ,这个时候可以自定义一个加签拦截器注解@Sign来实现

请求重试

在接口或者方法上加上@Retry注解即可。@Retry支持重试次数maxRetries、重试时间间隔intervalMs以及重试规则retryRules配置

错误解码器

在HTTP发生请求错误(包括发生异常或者响应数据不符合预期)的时候,错误解码器可将HTTP相关信息解码到自定义异常中。你可以在@RetrofitClient注解的errorDecoder()指定当前接口的错误解码器,自定义错误解码器需要实现ErrorDecoder接口。

责任编辑:姜华 来源: 今日头条
相关推荐

2024-03-11 09:32:55

WebClientSpringHTTP

2024-10-18 08:00:00

SpringBoot框架开发

2024-03-08 10:05:09

SpringHTTP接口

2010-08-06 13:23:58

NFS配置

2010-07-20 14:07:31

更改TELNET端口

2010-06-08 17:46:31

OpenSUSE安装

2010-09-30 14:01:38

2010-11-23 16:21:07

MySQL大表备份

2009-08-12 16:47:36

C#转换农历

2010-03-15 14:10:34

ubuntu系统

2024-08-12 10:13:01

2011-04-06 09:09:17

MySQL数据库备份

2011-05-18 13:37:26

LINQ

2010-03-03 13:56:43

Linux ubant

2009-02-05 14:48:51

跳出循环多层循环编程

2011-03-02 10:01:15

2011-03-01 09:53:18

卸载PureFTPd

2021-04-16 11:02:40

Spring BootprivateJava

2022-12-12 11:42:12

定义接口private

2009-07-09 14:32:39

点赞
收藏

51CTO技术栈公众号