一文教你如何使用原生的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 Cookie技术(用户登录、浏览、访问权限)

    详细学习Java Cookie技术(用户登录、浏览、访问权限) 什么是Cookie Cookie是存储在用户本地计算机上的文本文件,它可以跨浏览器窗口和会话保留状态信息。在Java中,通过Cookie技术,我们可以实现用户登录、浏览历史管理等功能。Cookie是由服务器端发送到客户端,客户端再将它存储在本地,下次请求时再带上这个Cookie,服务器端就可以识…

    Java 2023年5月26日
    00
  • java对象序列化操作实例分析

    Java对象序列化操作 简介 Java对象序列化是指将Java对象转换为字节流,以便于数据传输、持久化和分布式应用等场景下的使用。其作用是将Java对象序列化为数据流方便在网络间传输或在本地存储,以及反序列化操作使其还原为Java对象。 序列化对象 对于待序列化的Java对象,需要实现 Serializable 接口。以下是一个示例: import java…

    Java 2023年5月26日
    00
  • java实现肯德基收银系统

    Java实现肯德基收银系统攻略 肯德基是一个全球知名的快餐品牌,设计和实现它的收银系统需要考虑到多种因素,例如订单管理、菜品管理、价格计算、支付方式、交易记录等。本文将介绍如何使用Java语言来设计和实现肯德基收银系统,包括以下步骤: 确定系统需求 首先需要明确肯德基收银系统需要实现的功能,包括: 菜品列表:系统需要维护肯德基提供的所有菜品的名称、价格和编号…

    Java 2023年5月30日
    00
  • 使用JSON.toJSONString格式化成json字符串时保留null属性

    使用JSON.toJSONString方法将Java对象转化为JSON字符串时,默认会将值为null的属性过滤掉。如果需要在生成的JSON字符串中保留null属性,可以通过设置输出时的SerializerFeature来实现。 具体步骤如下: 导入FastJSON库的依赖,示例代码如下: xml <dependency> <groupId&…

    Java 2023年5月26日
    00
  • Java实现定时任务的示例代码

    下面我将为你详细讲解一下“Java实现定时任务的示例代码”的完整攻略。 一、背景知识 在Java中,可以使用Timer类或ScheduledExecutorService类来实现定时任务。其中,Timer类是较为简单的一种方式,但该类有一些缺点:如果执行任务的时间太长,或者在任务执行期间抛出了异常,Timer可能会错过执行下一次任务的时间。因此,建议大家使用…

    Java 2023年5月19日
    00
  • JWT Token实现方法及步骤详解

    JWT Token实现方法及步骤详解 什么是JWT Token JWT(JSON Web Token)是一种用于访问网络资源的安全令牌。JWT用于在客户端和服务器之间安全地传输被称为声明的信息。 JWT包括三个部分,即头部(header)、载荷(payload)和签名(signature)。其中,头部是一个由两个字段组成的JSON对象,分别是类型(typ)和…

    Java 2023年5月20日
    00
  • Java中args参数数组的用法说明

    Java中args参数数组的用法说明 在Java程序中,可以通过在程序入口方法main()中使用args参数数组来接受外部传入的参数。本文将详细讲解args参数数组的用法和示例说明。 用法说明 args参数数组是在程序启动时被创建的,其中包含了从命令行传递给程序的参数。如果在运行Java程序时没有传递参数,那么args数组将为空。 args参数数组的定义如下…

    Java 2023年5月26日
    00
  • struts2开发流程及详细配置

    Struts2开发流程及详细配置 简介 Struts2是一种基于MVC设计模式的web框架,它是从Struts1框架升级而来。与Struts1相比,Struts2更加灵活、可扩展和易于使用。Struts2的开发流程涉及到安装、配置和实现。该攻略旨在帮助开发者了解Struts2框架的开发流程及详细配置。 开发流程 下面是Struts2的基本开发流程: 确认开发…

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