最近在搞微服務的東西,系統A提供了一個服務,定義方式:java
@RequestMapping(value = "/hasSuberList", method = RequestMethod.GET) @ResponseBody public String hasSuberList(List<String> peIdList){ if(peIdList == null || peIdList.size() == 0){ return "error"; } List<String> list = mqttService.hasSuberList(peIdList); return JSONArray.fromObject(list).toString(); }
系統B使用Feign進行訪問,接口定義方式以下:json
@FeignClient(value = "pe-processor") public interface PeFeignInter { @RequestMapping(value="/mqtt/hasSuberList") public String getTheSuberList(List<String> peId); @RequestMapping(value="/service/generalInterface") public String petojson(String petojson); }
下面進行服務調用的時候,服務提供方也就是A系統老是包不支持POST請求的異常。app
提供服務的接口定義的是GET請求,確定是服務Feign請求時採用了POST方法,因而修改接口:微服務
@FeignClient(value = "pe-processor")
public interface PeFeignInter {
@RequestMapping(value="/mqtt/hasSuberList",method = RequestMethod.GET)
public String getTheSuberList(List<String> peId);
@RequestMapping(value="/service/generalInterface",method = RequestMethod.POST)
public String petojson(String petojson);
}
發現仍是不行,仍是發送GET請求,那麼如何定義Feign請求時的請求類型呢?spa
feign消費服務時,以GET方式請求的條件:3d
若是想讓服務消費者採用GET方式調用服務提供者,那麼須要:blog
1.服務消費者這邊feign調用時,在全部參數前加上@RequestParam註解。接口
2.服務消費者這邊feign調用時,指明爲GET方式(注:若是不指明method,那麼在條件1知足的狀況下,採用的是默認的GET方式)。get
注:這裏條件1和條件2,是「且」的關係(都知足時,才爲GET)。qt
feign消費服務時,以POST方式請求的條件:
若是想讓服務消費者採用POST方式調用服務提供者,那麼只須要:
1.服務消費者這邊feign調用時,在全部參數前加上@RequestParam註解,並指明feign消費服務的方式爲POST。
2.服務消費者這邊feign調用時,有且只有一個參數前爲@RequestBody或什麼也沒有(若是有多個參數,那麼其他參數前必須有@RequestParam)。
注:這裏條件1和條件2,是「或」的關係(當至少一個知足時,即爲POST)。
注:在服務消費者中,使用feign消費服務時,若是參數前什麼也不寫,那麼默認是由@RequestBody指明的。
即:只要不知足GET方式請求,那麼POST方式請求是必定支持的。
原來是Feign接口參數前什麼也沒加,默認使用POST方式請求致使的。
下面對服務提供者進行修改,而且若是要接收List,參數前須要加@RequestBody註解(該方式只支持POST請求),
@RequestMapping(value = "/hasSuberList", method = RequestMethod.POST)
@ResponseBody
public String hasSuberList(@RequestBody List<String> peIdList){
if(peIdList == null || peIdList.size() == 0){
return "error";
}
List<String> list = mqttService.hasSuberList(peIdList);
return JSONArray.fromObject(list).toString();
}
再次訪問,可以進入到方法。此時又出現了新的問題,服務消費者老是報鏈接超時,
之前接觸過相似的錯誤,因此立馬感受是超時參數配置的問題,因而配置了ribbon的超時參數(在application.properties中):
再次訪問,成功。