溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何在Java中使用Feign發(fā)送一個HTTP請求

發(fā)布時間:2020-11-24 14:58:37 來源:億速云 閱讀:385 作者:Leah 欄目:開發(fā)技術(shù)

如何在Java中使用Feign發(fā)送一個HTTP請求?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

引入依賴

首先,我們需要將 Feign 的基礎(chǔ)依賴引入項目,因為我們只使用 Feign 的 remote 功能,因此,只引入基礎(chǔ)依賴。

此外在項目中,我們還自定義了了 JSON 轉(zhuǎn)換和 log 設(shè)置,因此還需要引入這些的第三方依賴,如下所示。

   <!-- feign -->
    <dependency>
      <groupId>io.github.openfeign</groupId>
      <artifactId>feign-core</artifactId>
      <version>10.10.1</version>
    </dependency>
    <dependency>
      <groupId>io.github.openfeign</groupId>
      <artifactId>feign-gson</artifactId>
      <version>10.10.1</version>
    </dependency>
    <dependency>
      <groupId>io.github.openfeign</groupId>
      <artifactId>feign-slf4j</artifactId>
      <version>10.10.1</version>
    </dependency>

發(fā)送路徑和方法設(shè)置

然后,因為 Feign 是一種申明式的調(diào)用,因此我們需要配置發(fā)送的接口路徑和發(fā)送接口定義,看下面的例子。

  @RequestLine("GET /user/getone&#63;arkOrgId={arkOrgId}&userId={userId}")
  JSONObject getOneStaff(@Param("arkOrgId") String arkOrgId,@Param("userId") String userId);

  @RequestLine("POST /user/add")
  @Headers("Content-Type: application/json")
  @Body("{body}")
  JSONObject saveStaff(@Param("body") SaveEmployeeDTO saveEmployeeDTO);

在代碼實例中,我們定義了兩種發(fā)送的實例,一種是 GET 請求,一種是 POST 請求,下面,我們分別來看一下其中的代碼的作用是什么。

  • @RequestLine:定義發(fā)送方式和發(fā)送接口定義,其中用 GET 和 POST 來定義發(fā)送方式,然后空格后,寫上 servelt path(context path 和域名或ip端口號在其他地方配置);
  • {}:用來作為占位符,動態(tài)填充需要的參數(shù);
  • @Param:用來匹配 URI 中的占位符;
  • @Headers("Content-Type: application/json"):構(gòu)建請求表頭,在 POST 請求中,需要聲明該請求的發(fā)送格式為 json;
  • @Body:POST 請求,需要標(biāo)注請求體;
  • JSONObject:在本實例中,采用是一個通用的 json 對象來接收,方便統(tǒng)一,在自己的代碼中,也可以定義一個接受實體類來接受,作用是一樣的。

POST 請求,需要在實體中重寫 toString() 方法,使其在發(fā)送時調(diào)用該方法后,是一個 JSON 字符串,詳細(xì)見后文 Tips 中寫的。

定義發(fā)送客戶端

@Configuration
public class FeignConfig {
  public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
  @Value("${staff.base.url}")
  private String staffBaseUrl;
  @Bean
  public StaffFeignService staffFeignService() {
    GsonBuilder builder = new GsonBuilder();
    builder.setDateFormat(DATE_TIME_FORMAT);
    return Feign.builder()
        .retryer(closeFeignRetry())
        .decoder(new GsonDecoder(builder.create()))
        .encoder(new GsonEncoder())
        .logger(new Slf4jLogger())
        .logLevel(Logger.Level.FULL)
        .target(StaffFeignService.class, staffBaseUrl);
  }
  /**
   * 關(guān)閉feign的失敗重試功能
   */
  @Bean
  public Retryer closeFeignRetry() {
    return Retryer.NEVER_RETRY;
  }

  @Bean
  public Request.Options options() {
    return new Request.Options(15000, 30000);
  }
}

緊接著,我們來定義發(fā)送客戶端。

首先,我們采用 @Value 來動態(tài)添加路由,這樣,就可以根據(jù)在配置文件中的屬性來添加 context path,從而做到可拓展。

然后,feign 的很多配置都是可以根據(jù)自身項目需要在 DIY 的,因此在這里,我們配置了編解碼采用 GSON 的編解碼器,日志級別設(shè)置全打印。通過該設(shè)置來生成一個 Feign 客戶端。

Feign 官方文檔,在官方文檔中,有詳細(xì)的配置說明,根據(jù)自身需要使用,即可。

使用

@Autowired
StaffFeignService staffFeignService;

// get 請求
JSONObject saveSingleQrCode = staffFeignService.saveSingleQrCode(userId);

// post 請求
SaveMultiQrCodesDTO saveMultiQrCodesDTO = new SaveMultiQrCodesDTO();;
JSONObject saveMultiQrCodes = staffFeignService.saveMultiQrCodes(saveMultiQrCodesDTO);

通過該方式,即可發(fā)送對應(yīng)請求。

Tips

記錄一些在使用中的重點,需要注意。

重寫 toString() 方法
在發(fā)送 JSON 時,需要重寫 toString() 方法,否則會導(dǎo)致接受方,無法用 json 進(jìn)行解析。

  @Override
  public String toString() {
    return JSON.toJSONString(this);
  }

異步客戶端

有時候,我們使用異步發(fā)送,從而不影響我們的主體業(yè)務(wù),F(xiàn)eign 也支持該種配置。

  @Bean
  public IHermesFeignService hermesFeignService() {
    GsonBuilder builder = new GsonBuilder();
    builder.setDateFormat(DATE_TIME_FORMAT);
    return AsyncFeign.asyncBuilder()
        .decoder(new GsonDecoder(builder.create()))
        .encoder(new GsonEncoder(builder.create()))
        .logger(new Slf4jLogger())
        .logLevel(Logger.Level.FULL)
        .target(IHermesFeignService.class, hermesBaseUrl);
  }

重點,就是在構(gòu)建 Feign 時,采用 AsyncFeign.asyncBuilder() 來進(jìn)行構(gòu)建。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI