最近在搞微服务的东西,系统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中):

再次访问,成功。

使用Feign调用服务的问题的更多相关文章

  1. 订单服务,使用feign调用服务

    通过feign实现订单中心(feign调用服务,在orderservice中调用product-server)     1.copy orderserver 为orderserverfeign     ...

  2. Spring Cloud 使用Feign调用服务传递Header中的参数

    1.使用Feign 调用其他微服务,尤其是在多级调用的同时,需要将一些共同的参数传递至下一个服务,如:token.比较方便的做法是放在请求头中,在Feign调用的同时自动将参数放到restTempla ...

  3. Spring Boot 和 Spring Cloud Feign调用服务及传递参数踩坑记录

    背景 :在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnectio ...

  4. SpringCloud使用Feign调用服务时,@FeignClient注解无法使用

    关于解决这个问题的理论根源传送门:https://blog.csdn.net/alinyua/article/details/80070890我在这里只提供解决方案 0. 结论和解决方案 Spring ...

  5. spring cloud feign 调用服务注意问题

    服务端 rest api @RequestMapping(value = "/phone") public ResponsePhone getPhone(@RequestParam ...

  6. 使用feign调用服务的时候注意的问题

    服务端 rest api @RequestMapping(value = "/phone") public ResponsePhone getPhone(@RequestParam ...

  7. 使用springcloud的feign调用服务时出现的错误:关于实体转换成json错误的介绍

    http://blog.csdn.net/java_huashan/article/details/46428971 原因:实体中没有添加无参的构造函数 fastjson的解释: http://www ...

  8. Spring Boot 和 Spring Cloud Feign调用服务及传递参数踩坑记录(转)

    https://blog.csdn.net/uotail/article/details/84673347

  9. spring cloud 微服务调用--ribbon和feign调用

    这里介绍ribbon和feign调用两种通信服务调用方式,同时介绍如何引入第三方服务调用.案例包括了ribbon负载均衡和hystrix熔断--服务降级的处理,以及feign声明式服务调用.例子包括s ...

随机推荐

  1. 使用JenKins实现自动执行python脚本

    1.使用Jenkins创建一个工程,工程主要配置项参照下图,其他配置项恢复默认 2.工程配置完成之后,点击[立即构建],执行完成后进入到控制台查看是否执行成功.

  2. anki vector robot入门语音指令大全

    vector机器人功能不断完善. 一:刚开始支持一些基础指令,你跟他说话他能在本机识别,然后做出相应的响应.在说这部分指令之前,需要加上Hey Vector.(嘿,维课的),然后他会准备听取你的指令, ...

  3. Java递归:一个NB自慰的操作

    递归的核心思想:自身调用自身 示例一:求5的阶乘 常规方法: 使用while循环 1 public class Demo01 { 2 3 public static void main(String[ ...

  4. win2008安装并配置zabbix3.4 agent

    agent 下载地址: https://www.zabbix.com/download_agents 下载解压后有2个文件夹,一个是bin,存放32位和64位执行程序,一个是conf目录存放着配置文件 ...

  5. HTML5播放RTSP,H5播放RTSP,解决方案源码,基于海康网络摄像头

    视频是用的海康网络摄像头(支持RTSP,标准H.264 RTP封装的设备),可以通过 rtsp://admin:1008@192.0.0.64:81/h264/ch1/main/av_stream   ...

  6. postfix配置&使用

    myorigin = $mydomain #以“user@example.com”(而不是“user@hostname.example.com”)发送邮件, #这样就没有理由将邮件发送到“user@h ...

  7. python使用高阶函数计算整数阶乘

    from functools import reduce num = 10 print(reduce(lambda x, y: x * y, range(1, num + 1)))

  8. 开源在线分析诊断工具Arthas(阿尔萨斯)--总结

    阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯) arthas用法 启动demo java -jar arthas-demo.jar 启动 java -jar arthas-boot.jar at ...

  9. linux下批量查找UTF-8的BOM文件,并去除BOM

    首先查找看看有哪些文件包含BOM find . -type f -print0 | xargs -0r awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile} ...

  10. Redis的过期策略和内存淘汰策略(转)

    Redis的过期策略 我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间.Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理. ...