当前位置: 首页 > news >正文

专业网站推荐武汉新闻最新消息

专业网站推荐,武汉新闻最新消息,Wordpress 主题 修改 版,泰安个人代做网站SpringBoot 3.2引入了新的 HTTP interface 用于http接口调用,采用了类似 openfeign 的风格。 具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-http-interface 一、概述 HTTP Interface 是一个类似于 openfeign 的同步接口调…

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 {@Autowiredprivate 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:

    @Autowiredprivate 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 {@Beanpublic RestTemplate restTemplate(RestTemplateBuilder builder) {return builder.build();}@Beanpublic 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 {@Autowiredprivate TestRestTemplate testRestTemplate;@Autowiredprivate RestTemplate restTemplate;private MockRestServiceServer mockRestServiceServer;@Beforepublic 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));}@Testpublic 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);}
}
http://www.yidumall.com/news/67948.html

相关文章:

  • 旅行社营业部管理办法优化大师手机版
  • 做网站需要先学什么网上卖产品怎么推广
  • 格尔木哪里有做网站的做外贸怎么推广
  • 营销网站的关键字2345网址导航官网官方电脑版
  • 做芯片代理哪个网站推广长沙网络推广外包
  • wordpress 整站加密今日新闻大事件
  • 公众号微信小程序是什么郑州百度网站快速优化
  • 中国建设银行网站缴费系统线上营销公司
  • 网站有哪些备案seo的中文名是什么
  • 零基础网站建设教程引流推广平台有哪些
  • 网站订单系统模板seo职位描述
  • 怎么让自己做的网站让别人看到大连百度关键词优化
  • 百度地图推广一年多少钱济南做seo外包
  • 建设雅马哈摩托车官方网站漳州网络推广
  • 无锡网站优化公司杭州网站seo推广软件
  • 如何 网站收录页面设计漂亮的网站
  • 简约个人网站欣赏下载百度app最新版并安装
  • 网站建设团队哪个最好百度推广个人怎么开户
  • 东营企业网站排名龙华线上推广
  • 洛可可设计公司待遇网站搜索关键词优化
  • 深圳服装网站建设百度搜索热度
  • 网赢做网站怎么样河南seo外包
  • 以绿色为主色的网站模版网站如何进行网络推广
  • 网站页面关键词都一样故事式软文范例500字
  • 网站建设域名未拿到电商具体是做什么的
  • 杭州标志设计公司关键词seo公司推荐
  • 全球军事新闻网站网络销售怎么做才能做好
  • 企业网站开发哪家专业哪里可以引流到精准客户呢
  • wordpress图片上传到七牛云网站建设优化400报价
  • 深圳网站设计公司 学校中山网站seo优化