FeignClient接口的几种方式总结

 @FeignClient这个注解,已经封装了远程调用协议。在springboot的开发,或者微服务的开发过程中,我们需要跨服务调用,或者调用外部的接口,我们都可以使用FeignClient。

一、@FeignClient介绍

@FeignClient 注解是 Spring Cloud 中的一个组件,它是基于 Netflix Feign 实现的。@FeignClient 注解可以帮助我们定义和实现服务之间的 RESTful 接口,使得服务之间的调用更加方便和可靠。@FeignClient 注解可以用于客户端的 API 接口定义,它可以将一个 HTTP API 接口转化为一个 Java 接口,从而使得我们可以像调用本地方法一样调用远程服务。

注解源码与解析
 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface FeignClient {

    @AliasFor("name")
    String value() default "";

    String contextId() default "";

    @AliasFor("value")
    String name() default "";

    @Deprecated
    String qualifier() default "";

    String[] qualifiers() default {};

    String url() default "";

    boolean decode404() default false;

    Class<?>[] configuration() default {};

    Class<?> fallback() default void.class;

    Class<?> fallbackFactory() default void.class;

    String path() default "";

    boolean primary() default true;

}

1.1 value属性
具有可选协议前缀的服务的名称。名称的同义词。无论是否提供url,都必须为所有客户端指定名称。可以指定为属性键,例如:${propertyKey}。

1.2 contextId属性
这将被用作bean名称,而不是名称(如果存在),但不会用作服务id。

1.3 name属性
和value作用相同

1.4 qualifier属性
已弃用qualifier()。如果qualifier()和 qualifiers() 都存在,我们将使用后者,除非 qualifiers() 返回的数组为空或仅包含null或空白值,在这种情况下,我们将首先返回qualifier() ,如果也不存在,则返回默认值=contextId+“FeignClient”。

1.5 qualifiers属性
如上,已说明

1.6 url属性
绝对URL或可解析的主机名(协议是可选的)

1.7 decode404属性
404是否应该解码而不是抛出虚假异常

1.8 configuration属性
用于外部客户端的自定义配置类。可以包含组成客户端的部分的覆盖@Bean定义,例如feign.codec.Decoder, feign.codec.Encoder, feign.Contract.

1.9 fallback属性
指定的外部客户端接口的回退类。回退类必须实现由该注释注释的接口,并且是有效的spring bean。

1.10 fallbackFactory属性
为指定的外部客户端接口定义回退工厂。回退工厂必须生成回退类的实例,这些实例实现由FeignClient注释的接口。回退工厂必须是有效的spring bean。

1.11 path属性
所有方法级映射使用的路径前缀。

1.12 primary属性
是否将外部代理标记为主bean。默认为true。

二、常见的FeignClient接口的几种方式总结

@FeignClient(name = "myhuaweicloud", url = "https://xxx.com/")
public interface HuaweicloudClient {
	
		/**
		 * 获取access-token接口
		 */
	    @PostMapping("v1/xxx/enterprises/access-token")
		public Map<String,Object>  getAccessToken(@RequestBody Map<String, Object> params);

	    /**
		 * 获取实况地址统一接口
		 */
	    @PostMapping("/v2/xxx/devices/channels/media/live-connections")
		public Map<String, Object> liveConnections(@RequestHeader(name = "Access-Token",required = true) String Token,@RequestBody Map<String, Object> params);

		/**
		 * 获取通道列表
		 * @param map
		 * @return
		 */
	    @GetMapping("/v1/xxx/channels")
		public Map<String, Object> channels( @RequestHeader(name = "Access-Token",required = true) String Token,@RequestParam("device_id")String deviceId,
				
				@RequestParam("offset") Integer offset,@RequestParam("limit")Integer limit );
	    
		/**
		 * 获取设备列表
		 * @param map
		 * @return
		 */
	    @GetMapping("/v1/xxx/devices")
		public Map<String, Object> devices( @RequestHeader(name = "Access-Token",required = true) String Token,
				@RequestParam("device_name") String deviceName,
				@RequestParam("offset") Integer offset,
				@RequestParam("limit")Integer limit);

}

1、我们使用@FeignClient(name = "myhuaweicloud", url = "https:/xxx.com/")

对接口进行注解。

接口中封装的方法有同通过

@PostMapping

@GetMapping 进行注解。

这两种请求方式对应。使用@PostMapping 注解,表示接口需要通过post进行请求,使用@GetMapping表示接口需要通过get请求。

2、看一下常见的参数传递方式

@RequestBody Map<String, Object> params

以body的方式传递json参数。

@RequestHeader(name = "Access-Token",required = true) String Token

请求头中传递参数

@RequestParam("device_name") String deviceName

已键值的方式拼接参数和值进行传递

猜你喜欢

转载自blog.csdn.net/dongjing991/article/details/132086839
今日推荐