zoukankan      html  css  js  c++  java
  • 使用Feign调用服务的问题

    最近在搞微服务的东西,系统A提供了一个服务,定义方式:

    	@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进行访问,接口定义方式如下:

    @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请求的异常。

      提供服务的接口定义的是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请求时的请求类型呢?

    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方式请求是一定支持的

    原来是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中):

    再次访问,成功。

  • 相关阅读:
    VBA的几个小Demo_2
    VBA的几个小Demo
    Django部署在阿里云服务器上
    python面试题及解析
    Django知识扩展
    Django文件下载2
    Django文件下载
    Django文件上传
    My_First_Web
    10个jQuery小技巧
  • 原文地址:https://www.cnblogs.com/zhangyongJava/p/9723631.html
Copyright © 2011-2022 走看看