用Feign实现第三方的HTTP请求

1 篇文章 0 订阅

最近,在使用spring cloud框架时,发现feign也能实现三方请求,而且实现很简单,请求接口的结构很清晰,便果断学习一波。记录一下。本次使用的依赖仅有openfeign。

 

一. Feign调用的简单实现

 

  • maven依赖
    <!-- openfeign依赖 -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
  • Feign配置方式

feign有三种使用方式,前一种多是用于无需配置的微服务内部调用,后两者是用于自定义配置的三方调用或者内部微服务调用。

 

1. 默认模式,不使用配置类,作用于服务内部调用而非三方请求接口。

 

这种情况下,如果不需要给注册中心的微服务添加额外的参数配置,那么可以不使用配置类,直接在yml配置打开feign开关即可。

此时默认使用SpringMVC契约模式。如下代码中,yml配置为用户中心的配置文件。如果一个业务中心想要根据用户id查询用户信息,那么便可以直接根据用户中心的服务名定位,如UserService 类中的@FeignClient配置,注册中心会自动根据服务名寻址到用户中心的地址。

# 用户中心的服务名
spring:
  application:
    name: user-service

# 注册中心
eureka:
  instance:
    prefer-ip-address: true
    hostname: localhost
  client:
    service-url:
      defaultZone: http://localhost:8080/eureka/

# feign
feign:
  httpclient:
    enabled: true
@FeignClient(name = "user-service", fallback = UserServiceHystrix.class)
public interface UserService {

  @GetMapping("/user/getUserById")
  Result getUserById(@RequestParam("id") String id);
}

 

2.自定义配置类。

 

自定义配置类时, 直接在feign的配置类上加@Configuration注解,该注解的方式是全局的,对于所有由@FeignClient注解的调用类都生效。这样的好处在于,调用项目注册中心的其他服务时不用频繁的手动去加载配置类。该配置类也会被加载到spring cloud feign的服务调用中。不过,比较致命的是,调用外部API时有可能会和微服务调用之间产生冲突。

Feign契约不支持SpringMVC契约,在feign契约下使用springMVC注解时,spring注解的部分功能会失效,甚至导致创建bean失败等。(大部分java.lang.IllegalStateException: Method getAllUrl not annotated with HTTP method type (ex. GET, POST) 异常都是由于契约问题造成的。)

 

3.自定义配置类法2 

 

自定义配置类时,另一种则是不使用注解对配置类加以标识,而是在@FeignClient的注解中添加配置参数,在需要调用外部API接口的feign调用类里手动加载该配置,加载方式如后文中ApiService服务所示。使用这种方式能将项目同注册中心的服务与外部API区分开来。但是需要每一个feign类去手动加载该配置。@FeignClient参数会在下文中讲到。

 

 

4. @FeignClient参数说明

 

@FeignClient用来修饰类、接口类、注解类等。它的所有参数如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {
  @AliasFor("name")
  String value() default "";

  /** @deprecated */
  @Deprecated
  String serviceId() default "";

  String contextId() default "";

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

  String qualifier() 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;
}

value:服务名,访问第三方接口时可以随便命名。支持从配置文件中获取配置。

name:请求的服务名(用于微服务时,请求其他服务名的名称)。

url:第三方请求地址,支持从配置文件中获取配置。

fallback:失败时请求的回调类,熔断处理。

configuration:手动加载feign配置类。

 

 

5. 自定义配置的简单实现。

 

A. Feign配置类

// 增加该配置时,该配置类就变成全局配置类
// @Configuration
public class FeignConfig implements RequestInterceptor {

  @Autowired
  private ObjectFactory<HttpMessageConverters> messageConverters;

  @Bean
  public Contract feignContract() {
    // feign 契约 @RequestLine
    return new Contract.Default();
    // springMVC契约 @GetMapping @PostMapping 等
    // return new SpringMvcContract();
  }

  // 记录请求和响应的头文件,正文和元数据的日志,需要在配置文件指出需要打印日志的类
  @Bean
  Logger.Level feignLoggerLevel() {
    return Logger.Level.FULL;
  }

  // 连接超时时间说明:连接超时时间,单位分钟,读取超时时间,单位秒,重定向为是
  @Bean
  public Options options() {
    return new Options(10, TimeUnit.MINUTES, 60, TimeUnit.SECONDS, true);
  }

  // 编码方式
  @Bean
  public Encoder feignFormEncoder() {
    return new SpringFormEncoder(new SpringEncoder(messageConverters));
  }

  // (全局设置)设置请求头等业务需要参数。
  @Override
  public void apply(RequestTemplate template) {

  }
}

 

B. 配置文件

使用yml文件配置。Feign默认使用URLConnection发送HTTP请求。可以通过配置文件修改他的http发送方式如:httpclient、okhttp等。可以根据自己的需求进行修改。

server:
  port: 8080

#设置feign请求方式
feign:
  httpclient:
    enabled: true

# 打开debug请求日志 可以使用的参数有info warn error debug等
logging:
  level:
    com.example.feign.feign.ApiService: debug

# 第三方请求地址
api:
  url: https://api.apiopen.top

 

 

C. 正式使用,feign无参数GET方式 请求三方接口

该部分的测试接口都是基于开源社区的测试接口。使用很久了,再次感谢一下开源社区大佬们的幸苦付出。现在有好多接口都用不了。希望大家不要恶意刷接口。

请求方式:GET

请求地址:https://api.apiopen.top/getSingleJoke

方法上使用的注解是feign契约(Contract)RequestLine。要使用Spring契约 GetMapping 等注解时,需要在FeignConfig中配置即可。

ApiService类代码如下:

@FeignClient(value = "api-service", url = "${api.url}"
    , fallback = ApiServiceHystrix.class, configuration = FeignConfig.class)
public interface ApiService {

  /**
   * 平台接口预览 方法名可以随便取
   */
  @RequestLine("GET /getAllUrl")
  List<String> getAllUrl();

}

ApiServiceHystrix类代码:

public class ApiServiceHystrix implements ApiService {

  @Override
  public List<String> getAllUrl() {
    // 设置调用失败时的降级处理
    return null;
  }
}

调用写好的接口,查看参数:

调用成功!Feign的基础调用很简单,如果需要调用多个相同地址的第三方请求,只需要新增方法即可,无需再增加额外的配置。但仅仅用于单次调用时,feign比起其他HTTP请求方式又稍显麻烦,不过胜在简洁明了。😀😀😀

 

 

6. Feign 的其他请求方式

 

  • Query参数

请求方式:POST

请求地址:https://api.apiopen.top/getImages

现在尝试用feign来进行Query请求。请求成功后,用于接收数据的对象可以是一个Java 对象类,也可以是JSONObject对象。当返回内容结构稳定时(成功失败所返回的数据格式相同时),Java对象才能准确接收到信息。

创建一个结果类:

@Data
public class ApiResult implements Serializable {

  private static final long serialVersionUID = 1L;

  private Integer code;

  private String message;

  private List result;

}

ApiService类中增加对应方法:

  @RequestLine("POST /getImages?page={page}&count={count}")
  ApiResult getImages(@Param("page") String page, @Param("count") String count);

请求结果:

 

  • POST表单

post表单请求发送时,请求参数要为Map类型的键值对。示例代码:

  @RequestLine("POST /deleteFeedback")
  ApiResult deleteFeedback(@RequestBody Map<String, ?> bodyMap);
  • 设置Header请求头

请求头可以通过feign注解 @HeaderMap(import feign.HeaderMap;)示例代码:

  @RequestLine("POST /requestHeader")
  JSONObject getTcText(@HeaderMap Map<String, Object> headers, @RequestBody Map<String, Object> map);

 

其他请求可移步git:open-feign

 

 

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Feign是一个基于Java的声明式HTTP客户端,用于简化调用第三方接口的开发。使用Feign可以让我们像调用本地方法一样调用远程接口。 要使用Feign调用第三方接口,首先需要在项目中引入Feign的依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` 接下来,在定义调用远程接口的接口上添加`@FeignClient`注解,并指定要调用的远程服务的名称。例如: ```java @FeignClient(name = "third-party-service") public interface ThirdPartyServiceClient { @GetMapping("/api/some-resource") ResponseEntity<String> getSomeResource(); } ``` 在上述示例中,`ThirdPartyServiceClient`接口定义了一个`getSomeResource()`方法,用于调用第三方服务的`/api/some-resource`接口。 最后,在需要调用远程接口的地方注入`ThirdPartyServiceClient`接口,并使用该接口的方法进行调用。例如: ```java @RestController public class MyController { private final ThirdPartyServiceClient thirdPartyServiceClient; public MyController(ThirdPartyServiceClient thirdPartyServiceClient) { this.thirdPartyServiceClient = thirdPartyServiceClient; } @GetMapping("/my-endpoint") public ResponseEntity<String> myEndpoint() { return thirdPartyServiceClient.getSomeResource(); } } ``` 在上述示例中,`MyController`中的`myEndpoint()`方法通过调用`ThirdPartyServiceClient`接口的方法来获取第三方服务的资源。 需要注意的是,Feign还支持其他功能,如请求拦截器、熔断器等,可以根据具体需求进行配置和使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值