使用Feign消費服務時POST/GET請求方式詳解

聲明:本結論基於Spring Cloud Dalston.RC1、Spring Boot1.5.2.RELEASE。

總體說明

feign消費服務時,以GET方式請求的條件:

如果想讓服務消費者采用GET方式調用服務提供者,那麼需要:

  1. 服務消費者這邊feign調用時,在所有參數前加上@RequestParam註解
  2. 服務消費者這邊feign調用時,指明為GET方式(註:如果不指明method,那麼在條件1滿足的情況下,采用的是默認的GET方式)。

註:這裡條件1和條件2,是“且”的關系(都滿足時,才為GET)

feign消費服務時,以POST方式請求的條件:

如果想讓服務消費者采用POST方式調用服務提供者,那麼隻需要:

  1. 服務消費者這邊feign調用時,在所有參數前加上@RequestParam註解,並指明feign消費服務的方式為POST
  2. 服務消費者這邊feign調用時,有且隻有一個參數前為@RequestBody或什麼也沒有(如果有多個參數,那麼其餘參數前必須有@RequestParam)。

註:這裡條件1和條件2,是“或”的關系(當至少一個滿足時,即為POST)

註:在服務消費者中,使用feign消費服務時,如果參數前什麼也不寫,那麼默認是由@RequestBody指明的

即:隻要不滿足GET方式請求,那麼POST方式請求是一定支持的

下面進行詳細說明

無參:

服務消費者以GET方式請求消費服務的情況(示例):

不指定method,則默認為get,等同於

服務消費者以POST方式請求消費服務的情況(示例):

單參:

服務消費者以GET方式請求消費服務的情況(示例):

參數前使用瞭@RequestParam,且指明瞭用GET方式

等同於(當所有參數前都有@RequestParam時,這時不指明method,則默認為采用GET方式):

服務消費者以POST方式請求消費服務的情況(示例):

  • 參數前使用瞭@RequestParam,且指明瞭用POST方式

  • 參數前未使用@RequestParam或參數前使用瞭@RequestBody註解(此時不論是否手動指定請求方式、不論指定的方式是POST還是GET,那麼最終都以POST方式消費服務)

註:在服務消費者中,使用feign消費服務時,如果參數前什麼也不寫,那麼默認是由@RequestBody指明的

註:@RequestBody註解的參數,需要POST方式才能傳遞數據。

註:在服務提供者的Controller中,

  • 如果要接收(服務消費中傳過來的)被@RequestBody指明的參數,那麼對應方法的對應參數前一定要有@RequestBody;(如果沒有的話,收到的參數值就為null;如果寫成@RequestParam的話,那麼feign調用會失敗)
  • 如果要接收(服務消費中傳過來的)被@RequestParam指明的參數,那麼可以寫@RequestParam,也可以不寫(當服務提供者中對應的參數名字與服務消費者傳過來的參數名字一致時,可以不寫,不一致時,需要寫)

多參:

服務消費者以GET方式請求消費服務的情況(示例):

如果想讓服務消費者采用GET方式調用服務提供者,那麼需要:

  1. 服務消費者這邊feign調用時,在所有參數前加上@RequestParam註解
  2. 服務消費者這邊feign調用時,指明為GET方式(註:如果不指明method,那麼在條件1滿足的情況下,默認采用的也是GET方式)。

等同於

服務消費者以POST方式請求消費服務的情況(示例):

多參數時,如果服務消費者想采用POST進行feign調用,那麼:服務消費者中該接口方法裡的這些參數前,最多隻能有一個參數是@RequestBody指明的,其餘的參數必須使用@RequestParam指明。

如:

等同於(String name 這個參數前什麼也不寫,那麼默認的即為@RequestBody)

如果服務消費者這邊feign調用時,所有參數前面都使用瞭@RequestParam註解時,但是指明的是POST方式,那麼最終還是以POST方式進行的:

服務提供者接收時:

  • 如果服務消費者傳過來參數時,全都用的是@RequestParam的話,那麼服務提供者的Controller中對應參數前可以寫@RequestParam,也可以不寫(當兩邊參數名字一致時,可以省略不寫)
  • 如果服務消費者傳過來參數時,有@RequestBody的話,那麼服務提供者的Controller中對應參數前必須要寫@RequestBody(如果是多參數的話,其餘參數前視情況可以寫@RequestParam,也可以不寫)

註意:如果接口與接口的實現分別處於兩個服務中,那麼接口就相當於服務消費者,而接口的實現則相當於服務提供者。兩者之間仍然滿足本文上所述要求。如:

服務消費者中的接口是這樣的:

那麼對應的服務提供者中的Controller應該是這樣的:

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: