这是工具开发连载的第二篇,还是做专项知识的铺垫,HTTP在互联网的地位就不用说了,本节咱们用Spring Boot来实现HTTP的请求,接上文,上一节咱们实现了浏览器访问http://localhost:8080/hello,看到页面打印Hello World,(打开springboot的大门【一】),下面咱们就用代码来步步讲解!
1.使用RestTemplate
1.1什么是RestTemplate
传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient,不过此种方法使用起来太过繁琐。
Spring这么强大的框架当然会提供一种简单便捷的模板类来进行操作,这就是RestTemplate。
RestTemplate方法的名称遵循命名约定,第一部分指出正在调用什么HTTP方法,第二部分指示返回的内容。
本节会介绍restTemplate.getForEntity/postForEntit、getForObject/postForObject方法,get/post指调用了HTTP的get/post方法,Entity指将HTTP响应转换为您选择的对象类型。
还有其他很多类似的方法,有兴趣的同学可以参考官方api。
1.2 创建RestTemplate
创建一个RestTemplate很简单,你只需下面几行代码就搞定了,剩下的交给Spring就好了
首先新建一个package命名为config,即所有配置相关的代码都放在这里;
ps.保持一个好的分类习惯很重要,后期工程越来越大,如果代码文件随意放,维护起来很头大;
为何要放在config下,Spring提供了很多小工具可供使用,RestTemplate就是其中一个,需要将其配置进来;
这里 @Configuration作用在类上就是表示这个类是用来配置工程需要的工具的
@Bean就是具体配置进来的工具,在项目启动时会被自动初始化并加载到容器中可供使用
1.3使用RestTemplate
上一步创建RestTemplate后,使用是很方便的,只要 @Autowired 注解引入。
这里@Autowired注解的意思是,当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去。
2.测试RestTemplate
2.1 SpringBootTest
Spring Test与JUnit等其他测试框架结合起来,提供了便捷高效的测试手段。而SpringBootTest 是在Spring Test之上的再次封装,增加了切片测试,增强了mock能力。简而言之就是SpringBootTest 是很强大的测试工具。
咱们用SpringBootTest来测试的RestTemplate,就请求上一篇创建的Hello World服务
首先再次看一下代码结构,会发现SpringBoot项目中有一个test目录,SpringBoot已经为我们创建了一个测试类
@RunWith是Junit4提供的注解,将Spring和Junit链接了起来
@SpringBootTest 作用是Spring将加载所有被管理的bean,基本等同于启动了整个服务,此时便可以开始功能测试
@Test作用在方法上,表明这是一个测试方法
2.2测试编码(getForObject/postForObject)
本着整洁的原则,咱们新建一个测试类,跟需要测试的代码目录对应起来.
在test目录下新建名为configTest 的package,一看就知道他是针对config目录的测试。
在configTest目录下新建RestTemplateConfig对应的测试类RestTemplateConfigTests。
同样的因为这是一个测试类,需要使用SpringBootTest、Junit4,所以引入注解
常用的Http请求一般为post/get两种,所以咱们就分别来完善一下,
首先,将RestTemplate引入进来(@Autowired);然后,编写测试方法(@Test)
测试get功能如下图
相应的测试post功能
2.3 执行测试
执行测试很简单,直接鼠标右击测试类名,选择 Run ‘RestTemplateConfigTests’
查看测试结果,不出意外,会报错如下
仔细研究报错内容‘I/O error on GET request for "http://localhost:8080/hello": Connection refused’
拒绝连接,不是说@SpringBootTest基本上等同于启动了整个服务吗,为啥拒绝连接?
基本等同不代表一样,事实上SpringBoot服务确实启动了,get请求也发出了,只是被拒绝了;
因为Tomcat服务并没有启动,所以没有提供可供访问的web服务
所以这里需要先启动工程,AutoSmokeTestingApplication中右击,选择Run ‘AutoSmokeTestingApplication’;
再次同样方法启动测试
结果如下,测试通过:
3.RestTemplate更厉害的
3.1getForEntity/postForEntity
很多场景下http请求想要的不仅仅是返回值,返回的状态码、Cookie等也是需要的.
发送http请求时也需要携带header参数。
这时候就要用到getForEntity/postForEntity
3.2exchange
这个留给大家来探索,加油!