使用Feign調用服務的問題

最近在搞微服務的東西,系統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中):

再次訪問,成功。

相關文章
相關標籤/搜索