最近在搞微服务的东西,系统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中):
再次访问,成功。