还在用HttpUtil?SpringBoot 3.0全新HTTP客户端工具来了,用起来够优雅!

这篇具有很好参考价值的文章主要介绍了还在用HttpUtil?SpringBoot 3.0全新HTTP客户端工具来了,用起来够优雅!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

还在用HttpUtil?SpringBoot 3.0全新HTTP客户端工具来了,用起来够优雅!

我们平时开发项目的时候,经常会需要远程调用下其他服务提供的接口,于是我们会使用一些HTTP工具类比如Hutool提供的HttpUtil。前不久SpringBoot 3.0发布了,出了一个Http Interface的新特性,它允许我们使用声明式服务调用的方式来调用远程接口,今天我们就来聊聊它的使用!

SpringBoot实战电商项目mall(50k+star)地址:github.com/macrozheng/…

简介

Http Interface让你可以像定义Java接口那样定义HTTP服务,而且用法和你平时写Controller中方法完全一致。它会为这些HTTP服务接口自动生成代理实现类,底层是基于Webflux的WebClient实现的。

使用声明式服务调用确实够优雅,下面是一段使用Http Interface声明的Http服务代码。

spingboot http客户端,spring boot,http,后端

使用

在SpringBoot 3.0中使用Http Interface是非常简单的,下面我们就来体验下。

依赖集成

  • 首先在项目的pom.xml中定义好SpringBoot的版本为3.0.0
xml复制代码<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.0</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
  • 由于SpringBoot最低要求为Java 17,我们需要先安装好JDK 17,安装完成后配置项目的SDK版本为Java 17,JDK下载地址:www.oracle.com/cn/java/tec…

spingboot http客户端,spring boot,http,后端

  • 由于Http Interface需要依赖webflux来实现,我们还需添加它的依赖。
xml复制代码<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

基本使用

下面以调用mall-tiny-swagger中的接口为例,我们来体验下Http Interface的基本使用。

  • 首先我们准备一个服务来方便远程调用,使用的是之前的mall-tiny-swagger这个Demo,打开Swagger看下,里面有一个登录接口和需要登录认证的商品品牌CRUD接口,项目地址:github.com/macrozheng/…
  • 先在application.yml中配置好mall-tiny-swagger的服务地址;
yaml复制代码remote:
  baseUrl: http://localhost:8088/
  • 再通过@HttpExchange声明一个Http服务,使用@PostExchange注解表示进行POST请求;
java复制代码/**
 * @auther macrozheng
 * @description 定义Http接口,用于调用远程的UmsAdmin服务
 * @date 2022/1/19
 * @github https://github.com/macrozheng
 */
@HttpExchange
public interface UmsAdminApi {

    @PostExchange("admin/login")
    CommonResult<LoginInfo> login(@RequestParam("username") String username, @RequestParam("password") String password);
}
  • 再创建一个远程调用品牌服务的接口,参数注解使用我们平时写Controller方法用的那些即可;
java复制代码/**
 * @auther macrozheng
 * @description 定义Http接口,用于调用远程的PmsBrand服务
 * @date 2022/1/19
 * @github https://github.com/macrozheng
 */
@HttpExchange
public interface PmsBrandApi {
    @GetExchange("brand/list")
    CommonResult<CommonPage<PmsBrand>> list(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize);

    @GetExchange("brand/{id}")
    CommonResult<PmsBrand> detail(@PathVariable("id") Long id);

    @PostExchange("brand/create")
    CommonResult create(@RequestBody PmsBrand pmsBrand);

    @PostExchange("brand/update/{id}")
    CommonResult update(@PathVariable("id") Long id, @RequestBody PmsBrand pmsBrand);

    @GetExchange("brand/delete/{id}")
    CommonResult delete(@PathVariable("id") Long id);
}
  • 为方便后续调用需要登录认证的接口,我创建了TokenHolder这个类,把token存储到了Session中;
java复制代码/**
 * @auther macrozheng
 * @description 登录token存储(在Session中)
 * @date 2022/1/19
 * @github https://github.com/macrozheng
 */
@Component
public class TokenHolder {
    /**
     * 添加token
     */
    public void putToken(String token) {
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = ((ServletRequestAttributes) ra).getRequest();
        request.getSession().setAttribute("token", token);
    }

    /**
     * 获取token
     */
    public String getToken() {
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = ((ServletRequestAttributes) ra).getRequest();
        Object token = request.getSession().getAttribute("token");
        if(token!=null){
            return (String) token;
        }
        return null;
    }

}
  • 创建Java配置,配置好请求用的客户端WebClient及Http服务对象即可,由于品牌服务需要添加认证头才能正常访问,所以使用了过滤器进行统一添加;
java复制代码@Configuration
public class HttpInterfaceConfig {

    @Value("${remote.baseUrl}")
    private String baseUrl;
    @Autowired
    private TokenHolder tokenHolder;

    @Bean
    WebClient webClient() {
        return WebClient.builder()
                //添加全局默认请求头
                .defaultHeader("source", "http-interface")
                //给请求添加过滤器,添加自定义的认证头
                .filter((request, next) -> {
                    ClientRequest filtered = ClientRequest.from(request)
                            .header("Authorization", tokenHolder.getToken())
                            .build();
                    return next.exchange(filtered);
                })
                .baseUrl(baseUrl).build();
    }

    @Bean
    UmsAdminApi umsAdminApi(WebClient client) {
        HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();
        return factory.createClient(UmsAdminApi.class);
    }

    @Bean
    PmsBrandApi pmsBrandApi(WebClient client) {
        HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();
        return factory.createClient(PmsBrandApi.class);
    }
}
  • 接下来在Controller中注入Http服务对象,然后进行调用即可;
java复制代码/**
 * @auther macrozheng
 * @description HttpInterface测试接口
 * @date 2022/1/19
 * @github https://github.com/macrozheng
 */
@RestController
@Api(tags = "HttpInterfaceController")
@Tag(name = "HttpInterfaceController", description = "HttpInterface测试接口")
@RequestMapping("/remote")
public class HttpInterfaceController {

    @Autowired
    private UmsAdminApi umsAdminApi;
    @Autowired
    private PmsBrandApi pmsBrandApi;
    @Autowired
    private TokenHolder tokenHolder;

    @ApiOperation(value = "调用远程登录接口获取token")
    @PostMapping(value = "/admin/login")
    public CommonResult<LoginInfo> login(@RequestParam String username, @RequestParam String password) {
        CommonResult<LoginInfo> result = umsAdminApi.login(username, password);
        LoginInfo loginInfo = result.getData();
        if (result.getData() != null) {
            tokenHolder.putToken(loginInfo.getTokenHead() + " " + loginInfo.getToken());
        }
        return result;
    }

    @ApiOperation("调用远程接口分页查询品牌列表")
    @GetMapping(value = "/brand/list")
    public CommonResult<CommonPage<PmsBrand>> listBrand(@RequestParam(value = "pageNum", defaultValue = "1")
                                                        @ApiParam("页码") Integer pageNum,
                                                        @RequestParam(value = "pageSize", defaultValue = "3")
                                                        @ApiParam("每页数量") Integer pageSize) {
        return pmsBrandApi.list(pageNum, pageSize);
    }

    @ApiOperation("调用远程接口获取指定id的品牌详情")
    @GetMapping(value = "/brand/{id}")
    public CommonResult<PmsBrand> brand(@PathVariable("id") Long id) {
        return pmsBrandApi.detail(id);
    }

    @ApiOperation("调用远程接口添加品牌")
    @PostMapping(value = "/brand/create")
    public CommonResult createBrand(@RequestBody PmsBrand pmsBrand) {
        return pmsBrandApi.create(pmsBrand);
    }

    @ApiOperation("调用远程接口更新指定id品牌信息")
    @PostMapping(value = "/brand/update/{id}")
    public CommonResult updateBrand(@PathVariable("id") Long id, @RequestBody PmsBrand pmsBrand) {
        return pmsBrandApi.update(id,pmsBrand);
    }

    @ApiOperation("调用远程接口删除指定id的品牌")
    @GetMapping(value = "/delete/{id}")
    public CommonResult deleteBrand(@PathVariable("id") Long id) {
        return  pmsBrandApi.delete(id);
    }
}

测试

  • 下面我们通过Postman进行测试,首先调用登录接口获取到远程服务返回的token了;

spingboot http客户端,spring boot,http,后端

  • 再调用下需要登录认证的品牌列表接口,发现可以正常访问。

spingboot http客户端,spring boot,http,后端

总结

Http Interface让我们只需定义接口,无需定义方法实现就能进行远程HTTP调用,确实非常方便!但是其实现依赖Webflux的WebClient,在我们使用SpringMVC时会造成一定的麻烦,如果能独立出来就更好了!

参考资料

官方文档:docs.spring.io/spring-fram…

项目源码地址

github.com/macrozheng/…文章来源地址https://www.toymoban.com/news/detail-835766.html

到了这里,关于还在用HttpUtil?SpringBoot 3.0全新HTTP客户端工具来了,用起来够优雅!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 探索高效 Python HTTP 客户端:HTTPX

    项目地址:https://gitcode.com/encode/httpx 在现代 Web 开发中,高效的 HTTP 请求库是不可或缺的一部分。这就是我们要向您介绍的 HTTPX 的地方。HTTPX 是一个高性能、功能丰富的 Python HTTP 客户端,旨在成为 requests 库的一个有竞争力的替代品。 HTTPX 提供了全面的异步和同步支持,包括完

    2024年04月14日
    浏览(1)
  • HTTP介绍 原理 消息结构 客户端请求 服务器响应 HTTP状态码

    HTTP协议 是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(www.world wide web)服务器传输超文本到本地浏览器的传送协议 HTTP 是基于TCP/IP(三次握手,四次挥手)通信协议来传输数据(HTML文件,图片文件,查询结果等) TCP:可靠的,丢包重传 UTP:不可靠的,直播,

    2024年02月05日
    浏览(1)
  • 微服务中间件--http客户端Feign

    以前利用RestTemplate发起远程调用的代码: 存在下面的问题: 代码可读性差,编程体验不统一 参数复杂URL难以维护 Feign的介绍 Feign是一个声明式的http客户端, 其作用就是帮助我们优雅的实现http请求的发送, 解决上面提到的问题。 使用Feign的步骤如下: 1.引入依赖: 2.在order-

    2024年02月11日
    浏览(1)
  • 配置基于 AWS CRT 的 HTTP 客户端

    基于 AWS CRT 的 HTTP 客户端包括同步 AwsCrtHttpClient 和异步 AwsCrtAsyncHttpClient。基于 AWS CRT 的 HTTP 客户端具有以下 HTTP 客户端优势: 更快的 SDK 启动时间 更小的内存占用空间 降低的延迟时间 连接运行状况管理 DNS 负载均衡 SDK 中基于 AWS CRT 的组件 本主题中介绍的基于 AWS CRT 的 

    2024年02月21日
    浏览(1)
  • 【微服务】5、声明式 HTTP 客户端 —— Feign

    ✏️ 代码可读性差、编程体验不统一 ✏️ 当发送网络请求时的请求参数特别复杂的时候,URL 难以维护 ✏️ Github 地址:https://github.com/OpenFeign/feign ✏️ Feign 是一个 声明式 的 HTTP 客户端 ✏️ 可帮助开发者优雅地发送 HTTP 请求 ✏️ 依赖 ✏️ 启动开关 @EnableFeignClients ✏️

    2023年04月12日
    浏览(1)
  • 10. Linux下实现简单的http客户端请求

    本文Linux下实现简单的http客户端请求 HTTP(超文本传输协议)是一种用于在网络上进行数据通信的协议。HTTP 协议定义了客户端和服务器之间如何交换信息,包括请求和响应格式、使用的方法、状态码等。 在 HTTP 协议中,资源(Resource)指的是由 URL (统一资源定位符)所标识

    2024年02月16日
    浏览(1)
  • 使用Go语言的HTTP客户端进行负载均衡

    负载均衡是分布式系统中的重要概念,它用于将流量分散到多个服务器或服务上,以实现更好的性能、可靠性和可扩展性。在Go语言中,可以使用HTTP客户端进行负载均衡,确保请求被均匀地分配到多个服务器或服务上。 下面是一个使用Go语言HTTP客户端进行负载均衡的示例:

    2024年01月21日
    浏览(1)
  • java代码构建简单http服务器和客户端

    初识http a、超文本传输 、应用层的面向对象的协议,概念介绍网上资源一大堆,关键是基于TCP/IP通信协议来传递数据。 b、一开始接触web项目,都是先接触的servlet,tomcat服务器默认实现的一套http规范,提供了基础服务和组件环境,直接拿到请求、构建正文、响应客户端 然而

    2024年02月10日
    浏览(1)
  • 使用Go语言的HTTP客户端和服务器

    使用Go语言进行HTTP客户端和服务器开发是一种高效且强大的方式。Go语言的标准库提供了对HTTP协议的全面支持,使得创建HTTP客户端和服务器变得简单。 首先,让我们来看一下如何创建一个简单的HTTP服务器。在Go中,可以使用 net/http 包来创建HTTP服务器。以下是一个简单的示例

    2024年01月16日
    浏览(1)
  • 如何使用Laravel的HTTP客户端与外部API交互

    Laravel使API交互对新的和有经验的Web开发人员来说都是轻而易举的。Larvel的HTTP客户端是建立在PHP的Guzzle HTTP客户端之上,让开发者在进行HTTP请求时有更顺畅的体验。它的主要功能包括认证, 路由, 和有效的对象关系映射(ORM). 本文将探讨如何使用Laravel的HTTP客户端来进行请求, 调

    2024年01月21日
    浏览(2)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包