使用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中):

再次访问,成功。
使用Feign调用服务的问题的更多相关文章
- 订单服务,使用feign调用服务
通过feign实现订单中心(feign调用服务,在orderservice中调用product-server) 1.copy orderserver 为orderserverfeign ...
- Spring Cloud 使用Feign调用服务传递Header中的参数
1.使用Feign 调用其他微服务,尤其是在多级调用的同时,需要将一些共同的参数传递至下一个服务,如:token.比较方便的做法是放在请求头中,在Feign调用的同时自动将参数放到restTempla ...
- Spring Boot 和 Spring Cloud Feign调用服务及传递参数踩坑记录
背景 :在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnectio ...
- SpringCloud使用Feign调用服务时,@FeignClient注解无法使用
关于解决这个问题的理论根源传送门:https://blog.csdn.net/alinyua/article/details/80070890我在这里只提供解决方案 0. 结论和解决方案 Spring ...
- spring cloud feign 调用服务注意问题
服务端 rest api @RequestMapping(value = "/phone") public ResponsePhone getPhone(@RequestParam ...
- 使用feign调用服务的时候注意的问题
服务端 rest api @RequestMapping(value = "/phone") public ResponsePhone getPhone(@RequestParam ...
- 使用springcloud的feign调用服务时出现的错误:关于实体转换成json错误的介绍
http://blog.csdn.net/java_huashan/article/details/46428971 原因:实体中没有添加无参的构造函数 fastjson的解释: http://www ...
- Spring Boot 和 Spring Cloud Feign调用服务及传递参数踩坑记录(转)
https://blog.csdn.net/uotail/article/details/84673347
- spring cloud 微服务调用--ribbon和feign调用
这里介绍ribbon和feign调用两种通信服务调用方式,同时介绍如何引入第三方服务调用.案例包括了ribbon负载均衡和hystrix熔断--服务降级的处理,以及feign声明式服务调用.例子包括s ...
随机推荐
- vue集成环信IM
vue 集成环信im 简单demo 环信AppKey:1106190415055331#test 测试账号: test1 123456 test2 123456 test3 123456 默 ...
- 查看celery 队列长度
BROKER_URL = 'redis://127.0.0.1:6379/2' quque 名称:celery 查询队列长度命令: redis-cli -n 2 llen celery 注释: -n: ...
- python 解析命令行
python中的命令行解析最简单最原始的方法是使用sys.argv来实现,更高级的可以使用argparse这个模块.argparse从python 2.7开始被加入到标准库中,所以如果你的python ...
- docker(基础篇)
http://naotu.baidu.com/file/f02773930afb2d3d9e71621249099d31 centos7安装 https://yq.aliyun.com/articl ...
- Lunar Lander 月球冒险
发售年份 1979 平台 街机 开发商 雅达利(Atari) 类型 飞行模拟 https://www.youtube.com/watch?v=McAhSoAEbhM
- 图形化SVN管理搭建 subversion edge自行修改密码
参考文章: https://blog.csdn.net/buyaore_wo/article/details/84313467 安装版本: Subversion Edge 5.2.3 (Linux 6 ...
- 《重构-改善既有代码的设计》学习笔记----Extract Method(提炼函数)
看见一个过长的函数或者需要一段注释才能让人理解的代码,可以考虑将这段代码放进一个独立函数中. 创造一个新的函数,根据这个函数的意图来对它命名(以它“做什么”来命名,而不是以它“怎么做”命名). 需要重 ...
- gcc ld 链接器相关知识,调试指令(程序员的自我修养----链接、装载与库)
最近解决一个动态链接上的问题,因为以前从来没有接触过这方面的知识,所以恶补了一下,首先要了解gcc编译指令(makefile),ld链接器的选项(还有连接脚本section指定内存位置),熟悉查看连接 ...
- WinHTTrack Website Copier使用说明
WinHTTrack Website Copier使用说明 WinHTTrack Website Copier可以抓取整个网站或者某个网页.某个论坛帖子.以抓取论坛某个主题帖子为例: 1.打开WinH ...
- shell脚本命令远程连接ssh并执行命令
环境: redhat 6.5 根据网上提供方法,测试了很多写法都不成功,测试了很久才有了以下脚本. 命令远程连接ssh并执行命令,scp/ftp等远程连接操作同理: #!/usr/bin/expect ...