购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.2 HTTP调用之编码实践

对于HTTP请求,读者应该都不陌生。打开浏览器,在地址栏中输入一个正确的网址即可获得响应内容,如图5-5所示。

在实际的服务调用中肯定不会返回一个页面,而是返回接口的响应内容,比较常见的是JSON格式的字符串,如图5-6所示。

图5-5 浏览器中的网页效果

图5-6 在浏览器中请求API后的响应内容

那么不借助浏览器,在Java代码中该如何处理呢?接下来通过几个代码示例讲解在Java代码中如何发起HTTP请求和处理HTTP响应结果。

5.2.1 被调用端编码实现

先创建一个名称为service-demo的Spring Boot实例项目,将端口号设置为8081,然后分别创建ltd.newbee.cloud.service包和ltd.newbee.cloud.web包,用于分别存放业务层实现类和REST层的Controller类。

在ltd.newbee.cloud.service包中新建HelloServiceImpl类,代码如下:

定义了getName()方法,该方法的作用是返回一个字符串。

在ltd.newbee.cloud.web包中新建HelloServiceController类,代码如下:

HelloServiceController类使用@RestController注解,并不会返回视图对象。该类中定义了hello()方法,映射地址为/hello,在访问该地址后会返回一个字符串给调用端。

本节的代码主要用于功能展示,并没有演示复杂的功能逻辑。

接下来复制service-demo为service-demo2,并修改类名和配置文件中的端口号。这样就有了两个被调用端的实例,代码结构如图5-7所示。

图5-7 service-demo工程的代码结构

编码完成后分别启动两个实例,启动成功后,可以分别访问两个接口地址:

如果项目中没有报错,并且访问结果如图5-8所示,则编码完成。

被调用端的编码和验证都已经完成。下面编写调用端的代码。

图5-8 service01和service02的请求结果

在Java项目开发中,向其他服务发起HTTP调用是常见的功能需求,编码实现时需要使用客户端工具或第三方提供的HTTP开发包。有很多常用的HTTP开发包供开发人员选择,如Java自带的HttpUrlConnection类、HttpClient工具包、Spring提供的RestTemplate工具和WebClient工具。

笔者将分别使用HttpClient、RestTemplate、WebClient来演示它们是如何对HTTP请求进行处理的。

5.2.2 使用HttpClient处理请求

新建一个名称为request-demo的Spring Boot实例项目,将端口号设置为8083。在pom.xml文件中添加httpclient的依赖配置,代码如下:

之后创建ltd.newbee.cloud.web包,用于存放调用端所需的测试类。在ltd.newbee.cloud.web包中新建ConsumerController类,代码如下:

代码中定义了SERVICE_URL变量,用于存放请求地址。在httpClientTest()方法中,使用HttpClient工具对目标服务的接口进行了请求,并打印接收的请求结果。

编码完成后,依次启动service-demo、service-demo2、request-demo三个实例,启动成功后可以访问如下测试地址:

如果项目中没有报错,控制台打印出了此次的请求结果,则编码完成:

5.2.3 使用RestTemplate处理请求

RestTemplate是Spring提供的一个HTTP请求工具,它提供了常见的REST请求方案的模板,简化了在Java代码中处理HTTP请求的编码过程。接下来笔者将使用RestTemplate工具来完成HTTP请求的处理。

依然在request-demo项目中进行编码。先创建ltd.newbee.cloud.config包,并新建RestTemplate的配置类,代码如下:

然后在ConsumerController类中引入RestTemplate对象,并使用它来发起请求和处理请求回调结果,代码如下:

在restTemplateTest()方法中,使用RestTemplate工具对目标服务的接口进行了请求,并打印接收的请求结果。相较于HttpClient工具,RestTemplate工具编码更加简单,不管是发起请求还是请求回调的处理都做了很多封装,方便开发人员使用。

编码完成后,依次启动service-demo、service-demo2、request-demo三个实例,启动成功后可以访问如下测试地址:

如果项目中没有报错,控制台打印出了此次的请求结果,则编码完成:

5.2.4 使用WebClient处理请求

WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行HTTP请求的客户端工具。它的响应式编程基于Reactor。与RestTemplate工具类似,它们都是Spring官方提供的HTTP请求工具,方便开发人员进行网络编程。

只是二者有些许不同,RestTemplate是阻塞式客户端,WebClient是非阻塞式客户端,并且二者所依赖的Servlet环境不同,WebClient是Spring WebFlux开发库的一部分,引入starter场景启动器时使用的依赖如下:

不用引入spring-boot-starter-web。使用RestTemplate工具直接引用spring-boot-starter-web即可。

复制request-demo为request-demo2,修改pom.xml文件中的web场景启动器为spring-boot-starter-webflux,之后新建ConsumerController2类,并新增如下代码:

在webClientTest()方法中,使用WebClient工具对目标服务的接口进行请求,并打印接收的请求结果。相较于RestTemplate工具,WebClient工具的编码方式有所不同,可以应用函数式编程与流式API,支持Reactive类型(Mono和Flux)。

编码完成后,依次启动service-demo、service-demo2、request-demo2三个实例,启动成功后可以访问如下测试地址:

如果项目中没有报错,控制台打印出了此次的请求结果,则编码完成:

最终代码目录结构如图5-9所示。

当然,读者也可以自行编码,分别创建四个Spring Boot项目并进行编码。笔者为了功能演示和源码整理,把所有代码放在了同一个工程里。

图5-9 最终代码目录结构 Vj8/YZG0RP6but5n24ESZ7FGEQsfDK81YBS2S5N5OYnvyPQmrLumcveXJZOfSCi5

点击中间区域
呼出菜单
上一章
目录
下一章
×