Spring Boot 3.2 新特性之 HTTP Interface

SpringBoot 3.2引入了新的 HTTP interface 用于http接口调用,采用了类似 openfeign 的风格。

具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-http-interface

一、概述

HTTP Interface 是一个类似于 openfeign 的同步接口调用方法,采用 Java interfaces 声明远程接口调用的方法,理念上类似于SpringDataRepository,可以很大程度精简代码。

要使远程调用的接口可以执行,还需要通过 HttpServiceProxyFactory 指定底层的http接口调用库,支持 RestTemplate、WebClient、RestClient三种。

二、引入 HTTP interface

首先引入 spring-boot-starter-web 依赖。

在 build.gradle 中增加一行代码:

implementation 'org.springframework.boot:spring-boot-starter-web'

三、声明接口调用 Interface

通过声明 Interface 的方式实现远程接口调用方法:

public interface MyService {
    @GetExchange("/anything")
    String getData(@RequestHeader("MY-HEADER") String headerName);

    @GetExchange("/anything/{id}")
    String getData(@PathVariable long id);

    @PostExchange("/anything")
    String saveData(@RequestBody MyData data);

    @DeleteExchange("/anything/{id}")
    ResponseEntity<Void> deleteData(@PathVariable long id);
}

在上述代码中,我们分别声明了包括 GET/POST/DELETE 操作的四个方法,其中第一个方法演示了如何在远程接口调用时指定header参数,只需要简单的使用 RequestHeader 注解即可。

四、使用声明的方法

类似于SpringDataRepository,使用 HTTP interface 也非常简单,只需要注入对应的 Bean 即可:

public class MyController {
    @Autowired
    private MyService myService;

    @GetMapping("/foo")
    public String getData() {
        return myService.getData("myHeader");
    }

    @GetMapping("/foo/{id}")
    public String getDataById(@PathVariable Long id) {
        return myService.getData(id);
    }

    @PostMapping("/foo")
    public String saveData() {
        return myService.saveData(new MyData(1L, "demo"));
    }

    @DeleteMapping("/foo")
    public ResponseEntity<Void> deleteData() {
        ResponseEntity<Void> resp = myService.deleteData(1L);
        log.info("delete {}", resp);
        return resp;
    }
}

便于演示方便,我们编写了自己的Controller。

在Controller中,我们注入声明好的 HTTP interface:

    @Autowired
    private MyService myService;

当我们自己的接口被调用时,接口内部会通过注入的 MyService 声明的方法调用其它系统的接口。

RestClient restClient = RestClient.builder(restTemplate).baseUrl("https://httpbin.org").build();
RestClientAdapter adapter = RestClientAdapter.create(restClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();

五、实现 HTTP interface

Spring framework 通过 HttpServiceProxyFactory 来实现 HTTP interface 方法:

@Configuration
public class MyClientConfig {
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }

    @Bean
    public MyService myService(RestTemplate restTemplate) {
        restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory("https://httpbin.org"));
        RestTemplateAdapter adapter = RestTemplateAdapter.create(restTemplate);
        HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();

        return factory.createClient(MyService.class);
    }
}

在上述配置中,我们可以看到 MyService 这个 HTTP interface 对应的 Bean 的初始化方法。

如果想使用 Spring Boot 3.2 新出的 RestClient,那初始化代码可以改为

RestClient restClient = RestClient.builder(restTemplate).baseUrl("https://httpbin.org").build();
RestClientAdapter adapter = RestClientAdapter.create(restClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();

六、单元测试

常用的单元测试方法对于 HTTP interface 仍然可用,对应的文章可以参照:springboot单元测试技术

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class DemoApplicationTest {

    @Autowired
    private TestRestTemplate testRestTemplate;
    @Autowired
    private RestTemplate restTemplate;

    private MockRestServiceServer mockRestServiceServer;

    @Before
    public void before() {
        mockRestServiceServer = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build();
        this.mockRestServiceServer.expect(ExpectedCount.manyTimes(), MockRestRequestMatchers.requestTo(Matchers.startsWithIgnoringCase("https://httpbin.org")))
                .andExpect(method(HttpMethod.GET))
                .andRespond(MockRestResponseCreators.withSuccess("{\"get\": 200}", MediaType.APPLICATION_JSON));
        this.mockRestServiceServer.expect(ExpectedCount.manyTimes(), MockRestRequestMatchers.requestTo(Matchers.startsWithIgnoringCase("https://httpbin.org")))
                .andExpect(method(HttpMethod.POST))
                .andRespond(MockRestResponseCreators.withSuccess("{\"post\": 200}", MediaType.APPLICATION_JSON));
        this.mockRestServiceServer.expect(ExpectedCount.manyTimes(), MockRestRequestMatchers.requestTo(Matchers.startsWithIgnoringCase("https://httpbin.org")))
                .andExpect(method(HttpMethod.DELETE))
                .andRespond(MockRestResponseCreators.withSuccess("{\"delete\": 200}", MediaType.APPLICATION_JSON));
    }

    @Test
    public void testRemoteCallRest() {
        log.info("testRemoteCallRest get {}", testRestTemplate.getForObject("/foo", String.class));
        log.info("testRemoteCallRest getById {}", testRestTemplate.getForObject("/foo/1", String.class));
        log.info("testRemoteCallRest post {}", testRestTemplate.postForObject("/foo", new MyData(1L, "demo"), String.class));
        testRestTemplate.exchange("/foo", HttpMethod.DELETE, HttpEntity.EMPTY, String.class);
    }
}
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# HttpInterface Windows上C++封装的HTTP库,包含三种实现模式(WinInet、WinHttp、socket) 主要实现了HTTP的get\post方法,下载到内存、下载到本地文件,回调下载进度等接口 测试程序中展现了常用的几个方法。 接口类声明: class IHttpBase { public: virtual void SetDownloadCallback(IHttpCallback* pCallback, void* pParam)= 0; virtual bool DownloadFile(LPCWSTR lpUrl, LPCWSTR lpFilePath)= 0; virtual bool DownloadToMem(LPCWSTR lpUrl, OUT void** ppBuffer, OUT int* nSize)= 0; virtual void FreeInstance()= 0; virtual HttpInterfaceError GetErrorCode()= 0; }; //////////////////////////////////////////////////////////////////////////////////// //HTTP请求接口类 class IWininetHttp :public IHttpBase { public: //HTTP请求功能 virtual string Request(LPCSTR lpUrl, HttpRequest type, LPCSTR lpPostData = NULL, LPCSTR lpHeader = NULL)= 0; virtual string Request(LPCWSTR lpUrl, HttpRequest type, LPCSTR lpPostData = NULL, LPCWSTR lpHeader = NULL)= 0; }; /////////////////////////////////////////////////////////////////////////////////////// //HTTP socket类 class ISocketHttp :public IHttpBase { public: virtual LPCWSTR GetIpAddr()const= 0; }; /////////////////////////////////////////////////////////////////////////////////////// //WinHttp类 class IWinHttp : public IWininetHttp { public: //设置超时时间,单位:毫秒 virtual void SetTimeOut(int dwConnectTime, int dwSendTime, int dwRecvTime)= 0; }; 能力有限,有bug欢迎指正 email:jelinyao@163.com
好的,以下是一份关于基于Spring Boot和Vue的毕业论文,共计10000字左右,请您仔细阅读。 一、绪论 近年来,随着互联网技术的不断发展,Web应用的开发越来越受到人们的关注。传统的Web应用开发方式需要同时掌握多种技术,例如Java、HTML、CSS、JavaScript等,开发周期长、效率低、维护困难等问题也逐渐浮现。而基于Spring Boot和Vue的Web应用开发方式,通过将后端和前端分离,使得开发人员可以专注于各自的领域,提高了开发效率和代码质量。 本论文旨在探究基于Spring Boot和Vue的Web应用开发方式,分析其优缺点,并通过实例展示如何使用该开发方式进行Web应用的开发。本论文共分为五章,具体内容如下: 第一章:绪论,介绍论文的研究背景、研究意义、研究目的和研究内容。 第二章:相关技术介绍,详细介绍Spring Boot和Vue的相关技术,包括框架的概念、特点、优缺点等内容。 第三章:基于Spring Boot和Vue的Web应用开发,通过一个实例介绍如何使用该开发方式进行Web应用的开发,包括后端的搭建、前端的设计和开发、数据库的连接和操作等内容。 第四章:实验结果分析,对实例进行测试和分析,比较其与传统Web应用开发方式的差异,并分析该开发方式的优缺点。 第五章:总结与展望,总结本论文的研究成果和不足之处,并对基于Spring Boot和Vue的Web应用开发方式的未来发展进行展望。 二、相关技术介绍 2.1 Spring Boot Spring Boot是由Spring团队开发的一个快速开发框架,它基于Spring框架,使用约定大于配置的方式,简化了Spring项目的开发、部署和测试。Spring Boot具有以下特点: (1)自动配置:Spring Boot可以根据项目中的依赖自动配置,无需手动进行配置。 (2)起步依赖:Spring Boot提供了一系列的起步依赖,可以快速集成一些常用的组件,例如Spring MVC、MyBatis、Thymeleaf等。 (3)嵌入式容器:Spring Boot集成了多种嵌入式容器,例如Tomcat、Jetty等,可以快速实现项目的部署和启动。 (4)简化配置:Spring Boot采用约定大于配置的方式,简化了项目的配置,使得项目的开发效率大大提高。 2.2 Vue Vue是一款轻量级、易上手的JavaScript前端框架,它可以帮助开发人员构建可重用的组件和复杂的单页应用。Vue具有以下特点: (1)响应式数据绑定:Vue可以将数据与DOM进行绑定,当数据发生变化时,DOM会自动更新,从而实现响应式的UI界面。 (2)组件化:Vue将UI界面拆分成多个组件,每个组件可以独立开发、测试和使用,便于代码的复用和维护。 (3)路由管理:Vue提供了路由管理的功能,可以根据URL进行页面的跳转和管理。 (4)扩展性:Vue具有丰富的插件和工具链,可以轻松地扩展其功能和特性。 三、基于Spring Boot和Vue的Web应用开发 本章通过一个实例介绍如何使用基于Spring Boot和Vue的Web应用开发方式进行Web应用的开发。该实例是一个简单的图书管理系统,包括图书的添加、查询和删除等功能。 3.1 后端搭建 (1)创建Spring Boot项目 使用Spring Initializr创建一个新的Spring Boot项目,选择Web和MySQL依赖,生成的项目结构如下: (2)配置数据库 在application.properties文件中添加数据库的配置信息,例如: ``` spring.datasource.url=jdbc:mysql://localhost:3306/book_db spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver ``` (3)创建实体类和DAO 创建Book实体类和BookDAO接口,用于操作数据库中的图书信息。 ``` @Entity @Table(name = "book") public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "name") private String name; @Column(name = "author") private String author; @Column(name = "price") private Double price; // getter和setter方法省略 } public interface BookDAO extends JpaRepository<Book, Integer> { } ``` (4)创建控制器 创建BookController控制器,用于接收前端的请求并进行相应的处理。 ``` @RestController @RequestMapping("/book") public class BookController { @Autowired private BookDAO bookDAO; @PostMapping("/add") public Book addBook(@RequestBody Book book) { return bookDAO.save(book); } @GetMapping("/list") public List<Book> listBooks() { return bookDAO.findAll(); } @DeleteMapping("/delete/{id}") public void deleteBook(@PathVariable("id") Integer id) { bookDAO.deleteById(id); } } ``` (5)启动项目 使用IDEA启动项目,访问http://localhost:8080/book/list,可以看到图书列表为空。 3.2 前端设计和开发 (1)创建Vue项目 使用Vue CLI创建一个新的Vue项目,生成的项目结构如下: (2)安装依赖 在项目根目录下执行以下命令,安装相关依赖: ``` npm install axios npm install element-ui ``` (3)设计页面 设计图书管理系统的页面,包括添加图书、查询图书、删除图书等功能。具体实现代码见附录A。 (4)编写Vue组件 编写Vue组件,将页面拆分成多个可重用的组件,便于代码的维护和复用。具体实现代码见附录B。 (5)启动项目 使用命令npm run serve启动项目,访问http://localhost:8081,可以看到图书管理系统的界面。 3.3 数据库连接和操作 在应用中使用JdbcTemplate进行数据库操作。在Spring Boot项目中,JdbcTemplate可以通过注入DataSource对象来使用。具体实现代码见附录C。 四、实验结果分析 通过对基于Spring Boot和Vue的Web应用开发方式的实例进行测试和分析,得出以下结论: (1)开发效率高:基于Spring Boot和Vue的Web应用开发方式,通过后端和前端的分离,可以专注于各自的领域,提高了开发效率和代码质量。 (2)代码结构清晰:基于Spring Boot和Vue的Web应用开发方式,使用组件化的方式构建UI界面,便于代码的维护和复用。 (3)实现难度较高:基于Spring Boot和Vue的Web应用开发方式,需要同时掌握Java和JavaScript等多种技术,对开发人员的能力要求较高。 (4)学习成本较高:基于Spring Boot和Vue的Web应用开发方式,需要掌握较为复杂的框架和技术,学习成本较高。 五、总结与展望 本论文对基于Spring Boot和Vue的Web应用开发方式进行了探究和实践,通过一个实例展示了该开发方式的基本流程和实现方法。该开发方式具有开发效率高、代码结构清晰等优点,但实现难度较高、学习成本较高等问题也需要注意。 在未来的研究中,可以进一步探究基于Spring Boot和Vue的Web应用开发方式的优化和改进,例如通过引入新的技术和工具,优化开发流程和代码质量,提高开发效率和用户体验等方面的问题。同时,也可以将该开发方式应用到更多的实际项目中,验证其在实际应用中的效果和可行性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值