一文教你如何使用原生的Feign

一文教你如何使用原生的Feign

简介

Feign 是一个基于Java的HTTP客户端,用于将HTTP请求映射到界面上,并将调用者与远程服务进行解耦。Feign通过使用注解支持请求/响应编码、注释传播、错误处理等功能。

使用原生的Feign的步骤

步骤一:引入依赖

首先,我们需要在项目中引入feign相关的依赖,以下是一些常用的依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>

步骤二:创建Feign客户端接口

在创建Feign客户端接口时,我们需要使用 @FeignClient 注解来指定服务名称,@RequestMapping 注解来指定访问路径和请求参数。 它相当于使用 HTTP 请求映射到我们的 Java 方法。

@FeignClient(name = "clientname")
public interface MyFeignClient {

    @RequestMapping(value = "/get", method = RequestMethod.GET)
    String get();

    @RequestMapping(value = "/post", method = RequestMethod.POST)
    String post(@RequestParam(value = "param") String param);

}

步骤三:在Controller中调用Feign客户端接口

@RestController
public class MyController {

    @Autowired
    private MyFeignClient myFeignClient;

    @GetMapping("/testFeignGet")
    public String testFeignGet() {
        return myFeignClient.get();
    }

    @GetMapping("/testFeignPost")
    public String testFeignPost() {
        return myFeignClient.post("testParam");
    }

}

示例

示例一:调用远程http服务

@FeignClient(name = "httpbin", url = "https://httpbin.org")
public interface HttpBinClient {

    @GetMapping("/get")
    HttpBinResponse get();

    @PostMapping("/post")
    HttpBinResponse post(HttpBinRequest request);

}

@Data
class HttpBinResponse {
    private String url;
    private Map<String, String> headers;
    private HttpBinResponseArgs args;

    public HttpBinResponse() {
    }
}

@Data
class HttpBinResponseArgs {
    private String any;

    public HttpBinResponseArgs() {
    }
}

@Data
class HttpBinRequest {
    private String any;

    public HttpBinRequest() {
    }
}

上述代码中,我们定义了一个用于调用远程服务的接口 HttpBinClient,其中远程服务的地址是 https://httpbin.org。该接口还包含 get()post() 方法,分别对应着远程服务的 GET 和 POST 请求。同时我们还定义了调用返回值,其中 HttpBinResponse 对应着服务器响应的 JSON 格式数据。

接下来,我们通过调用 HttpBinClient 来测试一下:

@RestController
public class MyController {

    @Autowired
    private HttpBinClient httpBinClient;

    @GetMapping("/httpbinGet")
    public HttpBinResponse httpbinGet() {
        return httpBinClient.get();
    }

    @PostMapping("/httpbinPost")
    public HttpBinResponse httpbinPost() {
        HttpBinRequest request = new HttpBinRequest();
        request.setAny("HelloWorld");
        return httpBinClient.post(request);
    }
}

示例二:使用基于Spring Security的Feign客户端

@FeignClient(name = CryptoConfigService.FEIGN_CLIENT_NAME, configuration = CryptoConfigFeignClientConfiguration.class)
public interface CryptoConfigFeignClient {

    @GetMapping("/get_crypto_info")
    CryptoInfoDTO getCryptoInfo(@RequestParam(name = "type") Integer type, @RequestHeader(name = "Authorization") String token);

}

@Configuration
public class CryptoConfigFeignClientConfiguration {

    @Autowired
    private OAuth2AuthorizedClientService authorizedClientService;

    @Bean
    public RequestInterceptor oAuth2FeignRequestInterceptor() {
        return new OAuth2FeignRequestInterceptor(authorizedClientService);
    }

}

上述代码中,我们定义了一个基于Spring Security的Feign客户端。该客户端的主要作用是调用远程服务来获取与加解密密钥相关的信息。在接口中,我们定义了 getCryptoInfo() 方法,同时提供了 Authorization 请求头和 type 请求参数,这些是需要通过Spring Security来处理的。

接下来,我们通过定义Spring Security的配置来获取 OAuth2AuthorizedClientService,在通过 OAuth2FeignRequestInterceptor 来构建 RequestInterceptor 对象来实现token的传递。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private static final String ROLE_NAME = "USER";

    @Autowired
    private OAuth2AuthorizedClientService authorizedClientService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().hasRole(ROLE_NAME);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("username").password("password").roles(ROLE_NAME);
    }

    @Bean
    public RequestInterceptor oAuth2FeignRequestInterceptor() {
        return new OAuth2FeignRequestInterceptor(authorizedClientService);
    }

}

上述代码中,我们定义了一个Spring Security的配置 SecurityConfig。在方法 oAuth2FeignRequestInterceptor() 部分,我们提供了一个用于获取 token 的 OAuth2AuthorizedClientService 对象,这个对象通过构造函数注入来获得。通过重写 configure()configure(AuthenticationManagerBuilder auth) 方法来指定用户账号和密码的信息,并设置用户角色为 USER

最后,我们再来测试一下使用基于Spring Security的Feign客户端。这里我们引入了Spring Security,同时调用了远程的加解密服务,这样你就可以更好的理解 Feign 是如何与其他的框架进行集成的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文教你如何使用原生的Feign - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java springmvc乱码解决归纳整理详解

    Java Spring MVC 是一种非常流行的 Java Web 开发框架。它提供了许多特性和强大的功能,但是在处理中文文本等需要编码转换的场景中,往往会遇到乱码问题。本篇攻略将详细讲解如何解决 Java Spring MVC 中的乱码问题。 1. 请求编码解决 一般情况下,在处理 HTTP 请求时,浏览器会设置请求的编码格式。但是如果请求头中没有指定编码…

    Java 2023年5月20日
    00
  • JVM面试和学习中需要注意的部分

    在学习jvm的时候许多人处于迷茫的状态,对一些基础的知识反而听过就忘了,这篇笔记是我在学习jvm的时候随手记的一些,适合已经学过或者了解过的小伙伴复习回顾一下,当然知识的覆盖是没有的,主要记录了我觉得容易忘记或者记错的知识点,这些有很多是基石知识,希望大家不要忘记,大家看到就当正好复习一下,对大家的面试可能会有一点小小的帮助 内存结构 1.方法区用来存储类加…

    Java 2023年5月8日
    00
  • JavaSpringBoot报错“ConflictException”的原因和处理方法

    原因 “ConflictException” 错误通常是以下原因引起的: 数据库冲突:如果您的数据库存在冲突,则可能会出现此错误。在这种情况下,需要检查您的数据库并确保它们正确。 代码逻辑问题:如果您的代码逻辑存在问题,则可能会出现此错误。在这种情况下,需要检查您的代码逻辑并确保它们正确。 并发问题:如果您的应用程序存在并发问题,则可能会出现此错误。在这种情…

    Java 2023年5月4日
    00
  • 微信小程序 ES6Promise.all批量上传文件实现代码

    让我来详细讲解一下“微信小程序 ES6Promise.all批量上传文件实现代码”的攻略过程。 先了解一下Promise.all 在了解如何使用ES6中的Promise.all实现批量上传文件之前,我们先来了解一下Promise.all的相关知识。 Promise.all是一个非常强大的方法,它可以将多个Promise实例包装成一个新的Promise实例。当…

    Java 2023年5月23日
    00
  • Spring quartz Job依赖注入使用详解

    Spring Quartz Job依赖注入使用详解 介绍 Spring框架提供了一个任务调度组件——Quartz。Quartz可用于在指定时间、日期执行任务或按规定时间间隔执行任务,比如定时备份、数据同步等任务。 在Quartz中定义任务的时候,我们可能需要依赖注入一些Spring管理的Bean,通过Spring支持的依赖注入特性,Quartz任务类很容易获…

    Java 2023年6月15日
    00
  • JavaScript 函数replace深入了解

    JavaScript 函数replace深入了解 什么是replace函数? replace()是 JavaScript 内置函数之一,它用于在字符串中替换与某个模式匹配的子字符串。replace()函数有两个参数,第一个参数是要替换的内容,可以是字符串或 正则表达式 ;第二个参数是新内容。 语法 string.replace(searchValue, re…

    Java 2023年6月15日
    00
  • PostMan post请求发送Json数据的方法

    PostMan是一款非常常用的API测试工具,可以轻松模拟请求并测试API接口。在许多情况下,我们需要发送JSON格式的数据来进行API测试。下面介绍在PostMan中如何使用post请求发送JSON数据的方法。 步骤一:打开PostMan 首先,打开PostMan并创建一个新的请求。 步骤二:选择Post请求 在请求建立之后,需要确保选择的请求类型是Pos…

    Java 2023年5月26日
    00
  • SpringMVC实现文件的上传和下载实例代码

    SpringMVC实现文件的上传和下载实例代码 在Web应用程序中,文件的上传和下载是非常常见的需求。SpringMVC提供了很多方便的方式来实现文件的上传和下载。本文将详细讲解SpringMVC实现文件的上传和下载的实例代码。 文件上传 在SpringMVC中,我们可以使用MultipartFile对象来处理文件上传。MultipartFile对象是Spr…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部