最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Feign如何實(shí)現(xiàn)第三方的HTTP請(qǐng)求

 更新時(shí)間:2022年10月28日 10:16:10   作者:澇山道士  
這篇文章主要介紹了Feign如何實(shí)現(xiàn)第三方的HTTP請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

最近,在使用spring cloud框架時(shí),發(fā)現(xiàn)feign也能實(shí)現(xiàn)三方請(qǐng)求,而且實(shí)現(xiàn)很簡(jiǎn)單,請(qǐng)求接口的結(jié)構(gòu)很清晰,便果斷學(xué)習(xí)一波。

記錄一下。本次使用的依賴(lài)僅有openfeign。

Feign調(diào)用的簡(jiǎn)單實(shí)現(xiàn)

maven依賴(lài)

    <!-- openfeign依賴(lài) -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

Feign配置方式

feign有三種使用方式,前一種多是用于無(wú)需配置的微服務(wù)內(nèi)部調(diào)用,后兩者是用于自定義配置的三方調(diào)用或者內(nèi)部微服務(wù)調(diào)用。

1. 默認(rèn)模式,不使用配置類(lèi),作用于服務(wù)內(nèi)部調(diào)用而非三方請(qǐng)求接口

這種情況下,如果不需要給注冊(cè)中心的微服務(wù)添加額外的參數(shù)配置,那么可以不使用配置類(lèi),直接在yml配置打開(kāi)feign開(kāi)關(guān)即可。

此時(shí)默認(rèn)使用SpringMVC契約模式。如下代碼中,yml配置為用戶(hù)中心的配置文件。

如果一個(gè)業(yè)務(wù)中心想要根據(jù)用戶(hù)id查詢(xún)用戶(hù)信息,那么便可以直接根據(jù)用戶(hù)中心的服務(wù)名定位,如UserService 類(lèi)中的@FeignClient配置,注冊(cè)中心會(huì)自動(dòng)根據(jù)服務(wù)名尋址到用戶(hù)中心的地址。

# 用戶(hù)中心的服務(wù)名
spring:
  application:
    name: user-service
 
# 注冊(cè)中心
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.自定義配置類(lèi)

自定義配置類(lèi)時(shí), 直接在feign的配置類(lèi)上加@Configuration注解,該注解的方式是全局的,對(duì)于所有由@FeignClient注解的調(diào)用類(lèi)都生效。

這樣的好處在于,調(diào)用項(xiàng)目注冊(cè)中心的其他服務(wù)時(shí)不用頻繁的手動(dòng)去加載配置類(lèi)。該配置類(lèi)也會(huì)被加載到spring cloud feign的服務(wù)調(diào)用中。

不過(guò),比較致命的是,調(diào)用外部API時(shí)有可能會(huì)和微服務(wù)調(diào)用之間產(chǎn)生沖突。

Feign契約不支持SpringMVC契約,在feign契約下使用springMVC注解時(shí),spring注解的部分功能會(huì)失效,甚至導(dǎo)致創(chuàng)建bean失敗等。

(大部分java.lang.IllegalStateException: Method getAllUrl not annotated with HTTP method type (ex. GET, POST) 異常都是由于契約問(wèn)題造成的。)

3.自定義配置類(lèi)法2 

自定義配置類(lèi)時(shí),另一種則是不使用注解對(duì)配置類(lèi)加以標(biāo)識(shí),而是在@FeignClient的注解中添加配置參數(shù),在需要調(diào)用外部API接口的feign調(diào)用類(lèi)里手動(dòng)加載該配置,加載方式如后文中ApiService服務(wù)所示。

使用這種方式能將項(xiàng)目同注冊(cè)中心的服務(wù)與外部API區(qū)分開(kāi)來(lái)。

但是需要每一個(gè)feign類(lèi)去手動(dòng)加載該配置。@FeignClient參數(shù)會(huì)在下文中講到。

4. @FeignClient參數(shù)說(shuō)明

@FeignClient用來(lái)修飾類(lèi)、接口類(lèi)、注解類(lèi)等。它的所有參數(shù)如下:

@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:服務(wù)名,訪(fǎng)問(wèn)第三方接口時(shí)可以隨便命名。支持從配置文件中獲取配置。
  • name:請(qǐng)求的服務(wù)名(用于微服務(wù)時(shí),請(qǐng)求其他服務(wù)名的名稱(chēng))。
  • url:第三方請(qǐng)求地址,支持從配置文件中獲取配置。
  • fallback:失敗時(shí)請(qǐng)求的回調(diào)類(lèi),熔斷處理。
  • configuration:手動(dòng)加載feign配置類(lèi)。

5. 自定義配置的簡(jiǎn)單實(shí)現(xiàn)

A. Feign配置類(lèi)

// 增加該配置時(shí),該配置類(lèi)就變成全局配置類(lèi)
// @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();
  }
 
  // 記錄請(qǐng)求和響應(yīng)的頭文件,正文和元數(shù)據(jù)的日志,需要在配置文件指出需要打印日志的類(lèi)
  @Bean
  Logger.Level feignLoggerLevel() {
    return Logger.Level.FULL;
  }
 
  // 連接超時(shí)時(shí)間說(shuō)明:連接超時(shí)時(shí)間,單位分鐘,讀取超時(shí)時(shí)間,單位秒,重定向?yàn)槭?
  @Bean
  public Options options() {
    return new Options(10, TimeUnit.MINUTES, 60, TimeUnit.SECONDS, true);
  }
 
  // 編碼方式
  @Bean
  public Encoder feignFormEncoder() {
    return new SpringFormEncoder(new SpringEncoder(messageConverters));
  }
 
  // (全局設(shè)置)設(shè)置請(qǐng)求頭等業(yè)務(wù)需要參數(shù)。
  @Override
  public void apply(RequestTemplate template) {
 
  }
}

B. 配置文件

使用yml文件配置。Feign默認(rèn)使用URLConnection發(fā)送HTTP請(qǐng)求??梢酝ㄟ^(guò)配置文件修改他的http發(fā)送方式如:httpclient、okhttp等??梢愿鶕?jù)自己的需求進(jìn)行修改。

server:
  port: 8080
 
#設(shè)置feign請(qǐng)求方式
feign:
  httpclient:
    enabled: true
 
# 打開(kāi)debug請(qǐng)求日志 可以使用的參數(shù)有info warn error debug等
logging:
  level:
    com.example.feign.feign.ApiService: debug
 
# 第三方請(qǐng)求地址
api:
  url: https://api.apiopen.top

C. 正式使用,feign無(wú)參數(shù)GET方式 請(qǐng)求三方接口

該部分的測(cè)試接口都是基于開(kāi)源社區(qū)的測(cè)試接口。使用很久了,再次感謝一下開(kāi)源社區(qū)大佬們的幸苦付出?,F(xiàn)在有好多接口都用不了。希望大家不要惡意刷接口。

請(qǐng)求方式:GET

請(qǐng)求地址:https://api.apiopen.top/getSingleJoke

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

ApiService類(lèi)代碼如下:

@FeignClient(value = "api-service", url = "${api.url}"
    , fallback = ApiServiceHystrix.class, configuration = FeignConfig.class)
public interface ApiService {
 
  /**
   * 平臺(tái)接口預(yù)覽 方法名可以隨便取
   */
  @RequestLine("GET /getAllUrl")
  List<String> getAllUrl();
 
}

ApiServiceHystrix類(lèi)代碼:

public class ApiServiceHystrix implements ApiService {
 
  @Override
  public List<String> getAllUrl() {
    // 設(shè)置調(diào)用失敗時(shí)的降級(jí)處理
    return null;
  }
}

調(diào)用寫(xiě)好的接口,查看參數(shù):

調(diào)用成功!Feign的基礎(chǔ)調(diào)用很簡(jiǎn)單,如果需要調(diào)用多個(gè)相同地址的第三方請(qǐng)求,只需要新增方法即可,無(wú)需再增加額外的配置。

但僅僅用于單次調(diào)用時(shí),feign比起其他HTTP請(qǐng)求方式又稍顯麻煩,不過(guò)勝在簡(jiǎn)潔明了。

6. Feign 的其他請(qǐng)求方式

  • Query參數(shù)

請(qǐng)求方式:POST

請(qǐng)求地址:https://api.apiopen.top/getImages

現(xiàn)在嘗試用feign來(lái)進(jìn)行Query請(qǐng)求。請(qǐng)求成功后,用于接收數(shù)據(jù)的對(duì)象可以是一個(gè)Java 對(duì)象類(lèi),也可以是JSONObject對(duì)象。當(dāng)返回內(nèi)容結(jié)構(gòu)穩(wěn)定時(shí)(成功失敗所返回的數(shù)據(jù)格式相同時(shí)),Java對(duì)象才能準(zhǔn)確接收到信息。

創(chuàng)建一個(gè)結(jié)果類(lèi):

@Data
public class ApiResult implements Serializable {
 
  private static final long serialVersionUID = 1L;
 
  private Integer code;
 
  private String message;
 
  private List result;
 
}

ApiService類(lèi)中增加對(duì)應(yīng)方法:

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

請(qǐng)求結(jié)果:

  • POST表單

post表單請(qǐng)求發(fā)送時(shí),請(qǐng)求參數(shù)要為Map類(lèi)型的鍵值對(duì)。示例代碼:

  @RequestLine("POST /deleteFeedback")
  ApiResult deleteFeedback(@RequestBody Map<String, ?> bodyMap);
  • 設(shè)置Header請(qǐng)求頭

請(qǐng)求頭可以通過(guò)feign注解 @HeaderMap(import feign.HeaderMap;)示例代碼:

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

其他請(qǐng)求可移步git:open-feign

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring手寫(xiě)簡(jiǎn)化版MVC流程詳解

    Spring手寫(xiě)簡(jiǎn)化版MVC流程詳解

    Spring MVC是Spring Framework的一部分,是基于Java實(shí)現(xiàn)MVC的輕量級(jí)Web框架。本文將通過(guò)簡(jiǎn)單示例帶大家掌握SpringMVC簡(jiǎn)化版手寫(xiě)方法,感興趣的可以了解一下
    2022-11-11
  • SpringBoot集成Mybatis的實(shí)現(xiàn)步驟

    SpringBoot集成Mybatis的實(shí)現(xiàn)步驟

    這篇文章主要介紹了SpringBoot集成Mybatis的實(shí)現(xiàn)步驟,本文通過(guò)SpringBoot +MyBatis 實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)學(xué)生表的查詢(xún)操作,需要的朋友可以參考下
    2020-12-12
  • Spring高級(jí)接口A(yíng)ware淺析

    Spring高級(jí)接口A(yíng)ware淺析

    通過(guò)aware接口可以獲取Spring容器相關(guān)信息,但這樣會(huì)與Spring容器耦合,這篇文章主要介紹了Spring aware接口理解,需要的朋友可以參考下
    2023-01-01
  • Java自定義一個(gè)變長(zhǎng)數(shù)組的思路與代碼

    Java自定義一個(gè)變長(zhǎng)數(shù)組的思路與代碼

    有時(shí)我們希望將把數(shù)據(jù)保存在單個(gè)連續(xù)的數(shù)組中,以便快速、便捷地訪(fǎng)問(wèn)數(shù)據(jù),但這需要調(diào)整數(shù)組大小或者對(duì)其擴(kuò)展,下面這篇文章主要給大家介紹了關(guān)于Java自定義一個(gè)變長(zhǎng)數(shù)組的思路與代碼,需要的朋友可以參考下
    2022-12-12
  • 淺析Spring容器原始Bean是如何創(chuàng)建的

    淺析Spring容器原始Bean是如何創(chuàng)建的

    這篇文章主要是想和小伙伴們一起聊聊?Spring?容器創(chuàng)建?Bean?最最核心的?createBeanInstance?方法,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2023-08-08
  • 在CentOS系統(tǒng)上安裝Java的openjdk的方法

    在CentOS系統(tǒng)上安裝Java的openjdk的方法

    這篇文章主要介紹了在CentOS系統(tǒng)上安裝Java的openjdk的方法,同樣適用于Fedora等其他RedHat系的Linux系統(tǒng),需要的朋友可以參考下
    2015-06-06
  • springboot整合druid連接池的步驟

    springboot整合druid連接池的步驟

    這篇文章主要介紹了springboot整合druid連接池的步驟,幫助大家更好的理解和學(xué)習(xí)springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • java封裝及四種權(quán)限修飾符詳解

    java封裝及四種權(quán)限修飾符詳解

    這篇文章主要介紹了java封裝及四種權(quán)限修飾符詳解,對(duì)屬性進(jìn)行封裝,使用戶(hù)不能直接輸入數(shù)據(jù),我們需要避免用戶(hù)再使用"對(duì)象.屬性"的方式對(duì)屬性進(jìn)行賦值
    2022-08-08
  • 15個(gè)頂級(jí)Java多線(xiàn)程面試題(附答案)

    15個(gè)頂級(jí)Java多線(xiàn)程面試題(附答案)

    這篇文章主要為大家分享了15個(gè)頂級(jí)Java多線(xiàn)程面試題,考察面試者是否有足夠的Java線(xiàn)程與并發(fā)知識(shí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 詳解Java中$符的各種使用場(chǎng)景

    詳解Java中$符的各種使用場(chǎng)景

    在Java編程中,我們會(huì)經(jīng)??吹?符的身影,比如經(jīng)常在配置文件中看到$符號(hào)作為變量占位符,用于在運(yùn)行時(shí)動(dòng)態(tài)地獲取變量值。本文將詳細(xì)介紹$符號(hào)在Java編程中的各種應(yīng)用場(chǎng)景,以幫助您更好地理解和運(yùn)用這個(gè)符號(hào),感興趣的小伙伴可以收藏一下
    2023-04-04

最新評(píng)論

涞源县| 东乡县| 永昌县| 岫岩| 黄浦区| 仁怀市| 罗田县| 沈丘县| 上栗县| 夏津县| 黄浦区| 隆昌县| 高安市| 磐安县| 河北区| 通江县| 平罗县| 营山县| 金塔县| 老河口市| 嘉禾县| 平凉市| 宣城市| 仁布县| 阳东县| 汉寿县| 湟源县| 沙田区| 内黄县| 红河县| 阜城县| 通渭县| 嵩明县| 麻栗坡县| 大同市| 徐汇区| 车致| 潼关县| 云阳县| 江安县| 瑞昌市|