Feign如何實(shí)現(xiàn)第三方的HTTP請(qǐng)求_第1頁(yè)
Feign如何實(shí)現(xiàn)第三方的HTTP請(qǐng)求_第2頁(yè)
Feign如何實(shí)現(xiàn)第三方的HTTP請(qǐng)求_第3頁(yè)
Feign如何實(shí)現(xiàn)第三方的HTTP請(qǐng)求_第4頁(yè)
Feign如何實(shí)現(xiàn)第三方的HTTP請(qǐng)求_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第Feign如何實(shí)現(xiàn)第三方的HTTP請(qǐng)求目錄Feign調(diào)用的簡(jiǎn)單實(shí)現(xiàn)1.默認(rèn)模式,不使用配置類,作用于服務(wù)內(nèi)部調(diào)用而非三方請(qǐng)求接口2.自定義配置類3.自定義配置類法24.@FeignClient參數(shù)說明5.自定義配置的簡(jiǎn)單實(shí)現(xiàn)6.Feign的其他請(qǐng)求方式最近,在使用springcloud框架時(shí),發(fā)現(xiàn)feign也能實(shí)現(xiàn)三方請(qǐng)求,而且實(shí)現(xiàn)很簡(jiǎn)單,請(qǐng)求接口的結(jié)構(gòu)很清晰,便果斷學(xué)習(xí)一波。

記錄一下。本次使用的依賴僅有openfeign。

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

maven依賴

!--openfeign依賴--

dependency

groupIdorg.springframework.cloud/groupId

artifactIdspring-cloud-starter-openfeign/artifactId

/dependency

Feign配置方式

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

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

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

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

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

#用戶中心的服務(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)

publicinterfaceUserService{

@GetMapping("/user/getUserById")

ResultgetUserById(@RequestParam("id")Stringid);

}

2.自定義配置類

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

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

不過,比較致命的是,調(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:MethodgetAllUrlnotannotatedwithHTTPmethodtype(ex.GET,POST)異常都是由于契約問題造成的。)

3.自定義配置類法2

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

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

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

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

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

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public@interfaceFeignClient{

@AliasFor("name")

Stringvalue()default"";

/**@deprecated*/

@Deprecated

StringserviceId()default"";

StringcontextId()default"";

@AliasFor("value")

Stringname()default"";

Stringqualifier()default"";

Stringurl()default"";

booleandecode404()defaultfalse;

Class[]configuration()default{};

Classfallback()defaultvoid.class;

ClassfallbackFactory()defaultvoid.class;

Stringpath()default"";

booleanprimary()defaulttrue;

}

value:服務(wù)名,訪問第三方接口時(shí)可以隨便命名。支持從配置文件中獲取配置。name:請(qǐng)求的服務(wù)名(用于微服務(wù)時(shí),請(qǐng)求其他服務(wù)名的名稱)。url:第三方請(qǐng)求地址,支持從配置文件中獲取配置。fallback:失敗時(shí)請(qǐng)求的回調(diào)類,熔斷處理。configuration:手動(dòng)加載feign配置類。

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

A.Feign配置類

//增加該配置時(shí),該配置類就變成全局配置類

//@Configuration

publicclassFeignConfigimplementsRequestInterceptor{

@Autowired

privateObjectFactoryHttpMessageConvertersmessageConverters;

@Bean

publicContractfeignContract(){

//feign契約@RequestLine

returnnewContract.Default();

//springMVC契約@GetMapping@PostMapping等

//returnnewSpringMvcContract();

//記錄請(qǐng)求和響應(yīng)的頭文件,正文和元數(shù)據(jù)的日志,需要在配置文件指出需要打印日志的類

@Bean

Logger.LevelfeignLoggerLevel(){

returnLogger.Level.FULL;

//連接超時(shí)時(shí)間說明:連接超時(shí)時(shí)間,單位分鐘,讀取超時(shí)時(shí)間,單位秒,重定向?yàn)槭?/p>

@Bean

publicOptionsoptions(){

returnnewOptions(10,TimeUnit.MINUTES,60,TimeUnit.SECONDS,true);

//編碼方式

@Bean

publicEncoderfeignFormEncoder(){

returnnewSpringFormEncoder(newSpringEncoder(messageConverters));

//(全局設(shè)置)設(shè)置請(qǐng)求頭等業(yè)務(wù)需要參數(shù)。

@Override

publicvoidapply(RequestTemplatetemplate){

}

B.配置文件

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

server:

port:8080

#設(shè)置feign請(qǐng)求方式

feign:

httpclient:

enabled:true

#打開debug請(qǐng)求日志可以使用的參數(shù)有infowarnerrordebug等

logging:

level:

com.example.feign.feign.ApiService:debug

#第三方請(qǐng)求地址

url:https://api.apiopen.top

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

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

請(qǐng)求方式:GET

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

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

ApiService類代碼如下:

@FeignClient(value="api-service",url="${api.url}"

,fallback=ApiServiceHystrix.class,configuration=FeignConfig.class)

publicinterfaceApiService{

*平臺(tái)接口預(yù)覽方法名可以隨便取

@RequestLine("GET/getAllUrl")

ListStringgetAllUrl();

}

ApiServiceHystrix類代碼:

publicclassApiServiceHystriximplementsApiService{

@Override

publicListStringgetAllUrl(){

//設(shè)置調(diào)用失敗時(shí)的降級(jí)處理

returnnull;

}

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

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

但僅僅用于單次調(diào)用時(shí),feign比起其他HTTP請(qǐng)求方式又稍顯麻煩,不過勝在簡(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ì)象類,也可以是JSONObject對(duì)象。當(dāng)返回內(nèi)容結(jié)構(gòu)穩(wěn)定時(shí)(成功失敗所返回的數(shù)據(jù)格式相同時(shí)),Java對(duì)象才能準(zhǔn)確接收到信息。

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

@Data

publicclassApiResultimplementsSerializable{

privatestaticfinallongserialVersionUID=1L;

privateIntegercode;

privateStringmessage;

privateListresult;

}

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

@RequestLine("POST/getImagespage={page}count={count}")

ApiResultgetImages(@Param("page")Stringpage,@Param("count")Stringcount);

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

POST表單

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

@RequestLine("POST/deleteFeedback")

ApiResultdeleteFeedback(@RequestBodyMapStrin

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論