返回顶部
首页 > 资讯 > 后端开发 > Python >Feign如何实现第三方的HTTP请求
  • 877
分享到

Feign如何实现第三方的HTTP请求

Feign HTTP请求第三方HTTP请求Feign第三方HTTP请求 2022-11-13 19:11:27 877人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录Feign调用的简单实现1. 默认模式,不使用配置类,作用于服务内部调用而非三方请求接口2.自定义配置类3.自定义配置类法2 4. @FeignClient参数说明5.

最近,在使用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
  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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Feign如何实现第三方的HTTP请求

本文链接: https://lsjlt.com/news/170336.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Feign如何实现第三方的HTTP请求
    目录Feign调用的简单实现1. 默认模式,不使用配置类,作用于服务内部调用而非三方请求接口2.自定义配置类3.自定义配置类法2 4. @FeignClient参数说明5....
    99+
    2022-11-13
    Feign HTTP请求 第三方HTTP请求 Feign第三方HTTP请求
  • vue如何实现第三方请求
    本文小编为大家详细介绍“vue如何实现第三方请求”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue如何实现第三方请求”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。vue实现第三方请求的方法:1、通过“impo...
    99+
    2023-07-05
  • feign如何打印出http请求
    目录feign打印出http请求1.记录请求和响应的头文件2.在配置文件中配置对应的包feign请求日志统一打印feign打印出http请求 用openfign依赖需要将请求的方法中...
    99+
    2024-04-02
  • 如何使用Feign调用第三方http接口
    本篇内容介绍了“如何使用Feign调用第三方http接口”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Feign调用第三方http接口我们平...
    99+
    2023-06-29
  • SpringCloud如何利用Feign访问外部http请求
    目录Feign访问外部http请求 累死人的写法:(仅参考)话不多说,先上pom.xmlbootstap.yml 部分配置在spingbootApplication启动类上...
    99+
    2024-04-02
  • nodejs如何实现原生的HTTP请求
    这篇文章主要介绍“nodejs如何实现原生的HTTP请求”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs如何实现原生的HTTP请求”文章能帮助大家解决问题。第一部分:创建一个HTTP请求在...
    99+
    2023-07-05
  • vue如何实现发送websocket请求和http post请求
    这篇文章主要介绍vue如何实现发送websocket请求和http post请求,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!先给大家介绍下vue发送websocket请求和http...
    99+
    2024-04-02
  • Netty4之如何实现HTTP请求、响应
    目录前言1.Netty中HTTP请求和响应类2.Netty中客户端、服务端的编解码器3.Server端编写Handler类处理客户请求4.测试总结前言 我们所编写的项目多以BS为主,...
    99+
    2023-05-14
    Netty4 HTTP请求 Netty4 HTTP响应
  • 实现HTTP请求的方法有哪些
    本篇文章为大家展示了实现HTTP请求的方法有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、HTTP的请求与响应HTTP协议(HyperText Transfer Protocol,超文本传输...
    99+
    2023-05-31
    http请求 请求
  • Java如何发起http请求的实现(GET/POST)
    前言 在未来做项目中,一些功能模块可能会采用不同的语言进行编写。这就需要http请求进行模块的调用。那么下面,我将以Java为例,详细说明如何发起http请求。 一、GET与POST...
    99+
    2024-04-02
  • Spring中的Http请求如何使用restTemplete实现
    这篇文章给大家介绍Spring中的Http请求如何使用restTemplete实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用Spring的restTemplete进行Http请求public class Res...
    99+
    2023-05-31
    resttemplete spring http请求
  • Go语言如何实现关闭http请求
    这篇文章主要介绍“Go语言如何实现关闭http请求”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言如何实现关闭http请求”文章能帮助大家解决问题。写在前面面试的时候问到如何关闭http请求,...
    99+
    2023-07-05
  • feign 如何获取请求真实目的ip地址
    需求 最近小编的项目中出现了很多feign 调用出现 Read Time out 的异常,但因为没有集成链路追踪的第三方框架,查不到原因。 所以想到打印请求的ip地址,判断是指定的服...
    99+
    2024-04-02
  • Angular如何通过HTTP Interceptor实现HTTP请求超时监控
    这篇文章主要介绍“Angular如何通过HTTP Interceptor实现HTTP请求超时监控”,在日常操作中,相信很多人在Angular如何通过HTTP Interceptor实现HTTP请求超时监控问题上存在疑惑,小编查阅了各式资料,...
    99+
    2023-07-02
  • 如何发现ISP劫持HTTP请求
    这篇文章将为大家详细讲解有关如何发现ISP劫持HTTP请求,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。编者按:Fundebug的客户通过分析我们提供的报警信息,定位了一...
    99+
    2024-04-02
  • 如何使用PHP实现同步HTTP请求并记录请求日志?
    PHP是一种流行的编程语言,它被广泛应用于Web开发领域。在Web开发中,我们通常需要使用HTTP请求与其他服务进行通信。本文将介绍如何使用PHP实现同步HTTP请求并记录请求日志,希望对你有所帮助。 一、PHP实现同步HTTP请求 在PH...
    99+
    2023-09-03
    同步 http 日志
  • AngularJS中$http模块POST请求的实现方法
    小编给大家分享一下AngularJS中$http模块POST请求的实现方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、代码...
    99+
    2024-04-02
  • Java 实现HTTP请求的四种方式总结
    前言 在日常工作和学习中,有很多地方都需要发送HTTP请求,本文以Java为例,总结发送HTTP请求的多种方式 HTTP请求实现过程 GET ▶️①、创建远程连接 ▶️②、设置连接方式(get、post、put…) ▶️③、设置连接超时...
    99+
    2023-08-17
    java http restful
  • C#winform请求http的实现(get,post)
    目录一:.Net中有两个类 HttpWebRequest 和HttpWebResponse 类来实现Http的请求二: HTTP定义了与服务器交互的不同方法POST与GET的差异两个...
    99+
    2024-04-02
  • @FeignClient 实现简便http请求封装方式
    目录@FeignClient实现http请求封装使用流程将http请求封装为FeignClient1.配置拦截器2.注入feignClient bean3.配置pom引用4.写fei...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作