java B2B2C Springcloud仿淘寶電子商城系統-宣告式呼叫Feign之請求引數

springcloud885發表於2019-04-18

1、Feign請求引數說明

電子商務平臺原始碼請加企鵝求求:一零三八七七四六二六。Feign是Netflix的產品,Spring Cloud Feign是在原生Feign的基礎上進行了封裝。由於Spring Cloud Feign引入了許多springmvc的註解,方便springmvc的使用者使用,但同時也給使用者帶來了很大的混淆,下面我們簡單講解一下springmvc和Spring Cloud Feign的引數繫結機制。

1.1 SpringMVC請求引數繫結機制

我們通過下面的例子進行講解:

@RestController
public class demoController{
  @RequestMapping("hello")
  public String hello(String name){
    return "hello"+name;
  }
}
複製程式碼

雖然介面很簡單,但是SpringMVC在解析請求時為做了很多的事情

@RequestMapping指定請求的路徑對映,我們GET,POST,DELETE,PUT的請求都可以對映到這裡;

SpringMVC提供的引數註解包括@RequestParm,@RequestBody,@PathVariable等,在例子中我們的引數name被預設新增@RequestParm註解,SpringMVC使用位元組碼技術獲取name這個名稱,自動檢測請求引數中key值為name的引數,如果我們的url請求或者form表單中包含name這個引數,就會被SpringMVC解析到。

1.2 Spring Cloud Feign請求引數繫結機制

SpringMVC的引數繫結機制和Feign的引數繫結機制是不一樣的。下面我們看一個錯誤的例子:

假如有這樣一個api:

@ResstController
public class demoController{
  @RequestMapping(value="hello",method=RequsetMethod.GET)
  public String hello(String name){
    return "hello"+name;
  }
複製程式碼

Feign 訪問這個api

@FeignClient(name = "hello")  
public interface IHelloService {  
  @RequestMapping(value = "/hello",method = RequestMethod.GET)  
  String hello (String name);  
}  
複製程式碼

由於我們指定了請求方式GET,那麼如果按照SpringMVC的引數繫結機制,name引數會被拼接在URL上,但是介面並未接收到,檢視後臺日誌發現:

請求方式不是GET,而是POST

name 引數為null

經過Google發現Feign的引數繫結機制與SpringMVC不同:

Feign預設使用@RequestBody,這就是上面name引數為null的原因,@RequestBody(只能有一個)一般用於傳遞物件,如果引數中出現多個物件可以使用Map來傳遞物件

@FeignClient(name = "hello")  
public interface IHelloService {  
  @RequestMapping(value = "/hello",method = RequestMethod.GET)  
  String saveBook(@RequestBody Book book);  
}  
複製程式碼
@FeignClient(name = "hello")  
public interface IHelloService {  
 @RequestMapping(value = "/hello",method = RequestMethod.GET)  
 String saveMap(@RequestParm Map map);  
}  
複製程式碼

Feign傳遞name引數,必須新增@RequestParm('name'),name必須指定,Feign不會利用SpringMVC位元組碼的機制自動給定一個預設名稱

@FeignClient(name = "hello")  
public interface IHelloService {  
  @RequestMapping(value = "/hello",method = RequestMethod.GET)  
  String hello (@RequestParm('name') String name);  
}
複製程式碼

2、@FeignClient註解與引數

@FeignClient註解被@Target(ElementType.TYPE)修飾,表明@FeignClient註解的作用在介面上

2.1 @FeignClient標籤常用屬性

name:指定FeignClient的名稱,如果專案使用了Ribbon,name屬性會作為微服務的名稱,用於服務發現

decode404:當發生http 404錯誤時,如果該欄位位true,會呼叫decoder進行解碼,否則丟擲FeignException

configuration: Feign配置類,可以自定義Feign的Encoder、Decoder、LogLevel、Contract

fallback: 定義容錯的處理類,當呼叫遠端介面失敗或超時時,會呼叫對應介面的容錯邏輯,fallback指定的類必須實現@FeignClient標記的介面

fallbackFactory: 工廠類,用於生成fallback類示例,通過這個屬性我們可以實現每個介面通用的容錯邏輯,減少重複的程式碼

path: 定義當前FeignClient的統一字首

java B2B2C Springcloud仿淘寶電子商城系統

相關文章