最近在搞微服务的东西,系统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. PYTHON的前端部分

    CSS部分,CSS起到修饰HTML的作用比如颜色,字体,等等. css如何和HTML共同其作用,那么CSS有几种引入HTML的方式 那么当引入了CSS如何让css对应的使相应的HTML标签上起作用,就 ...

  2. hello1 hello2 服务器安装加部署全过程

    1.安装maven和glassfish及配置环境变 首先搜索并下载maven3.6.0和glassfish4.1.1(版本看按需要选择). 点击安装包进行安装 安装完成后开始配置环境变量 打开系统环境 ...

  3. Go语言极速入门手册.go

    Github: https://github.com/coderzh/CodeTips /* gotips_test.go: Golang速学速查速用代码手册 Source: github.com/c ...

  4. gtest 三种事件机制

    前言: 1.首先说明gtest中事件的结构层次: 测试程序:一个测试程序只有一个main函数,也可以说是一个可执行程序是一个测试程序.该级别的事件机制会在程序的开始和结束执行. 测试套件:代表一个测试 ...

  5. mac电脑上如何启动mysql

    export PATH=$PATH:/usr/local/mysql/bin/   mysql -uroot -p

  6. activiti 任务监听参数的配置

    public class TaskListenersImp implements TaskListener { private Expression level; private Expression ...

  7. shell生成随机字符串

    #!/bin/bash i=1while [ $i -le 10000 ]doa=`echo `< /dev/urandom tr -dc A-Za-z0-9 | head -c6``echo  ...

  8. Windows10上桌面共享

    Windows自带的桌面共享软件 命令行输入: Msra.exe

  9. Docker基础操作

    安装 ubuntu16.04安装docker sudo apt-get update sudo apt-get install docker sudo apt-get install docker.i ...

  10. win10 vs2015源码编译tesseract4.0

    1.安装软件 cmake  下载地址 cppan   下载地址 安装完毕后,需要将cmake.exe和cppan.exe加入环境变量PATH中 cmake简介 CMake全称为“cross platf ...