spring cloud 怎么通过feign调用服务,springcloud feignclient
目录
@RequestBodyGET请求多参数的统一资源定位器正确写法如下邮政请求包含多个参数在使用假装调用其它服务时,发现获取的参数是空,当参数是对象是,是执行的邮政请求,所以要在方法参数前加@RequestBody,
@RequestBody
处理实体传递过来的数据,一般用来处理非content-type : application/x-www-form-urlencoded编码格式的数据。
得到请求中,因为没有HttpEntity,所以@请求体并不适用100 .邮政请求中,通过实体传递的参数,必须要在请求头中声明数据的类型内容类型,SpringMVC通过使用处理器适配器配置的HttpMessageConverters来解析实体中的数据,然后绑定到相应的豆上。
GET请求多参数的URL
假设我们请求的统一资源定位器包含多个参数,例如http://微服务-提供商-用户/get?id=用户名=张三,要怎么办呢?
我们知道春天的云为假装添加了的实现的注解支持,那么我们不妨按照的实现的写法尝试一下:
@ FeignClient(微服务-提供商-用户)公共接口UserFeignClient { @ request mapping(value=/get ,method=RequestMethod .获取)公共用户get0(用户用户);}然而我们测试时会发现该写法不正确,我们将会收到类似以下的异常:
假装FeignException:状态405读取UserFeignClient#get0(用户);内容: { 时间戳 :1482676142940,状态 :405,错误 : 不允许方法,异常 : 组织。spring框架。网络。http requestmethonotsupportedexception ,消息 : 不支持请求方法POST , path:/get}
由异常可知,尽管指定了得到方法,假装依然会发送邮政请求。
正确写法如下
(1) 方法一
@ FeignClient(name=微服务提供商用户)公共接口UserFeignClient { @ request mapping(value=/get ,method=RequestMethod .获取)公共用户get1(@RequestParam(id )长id,@RequestParam(用户名)字符串用户名);}这是最为直观的方式,网址有几个参数,假装接口中的方法就有几个参数。使用@RequestParam注解指定请求的参数是什么。
(2) 方法二
@ FeignClient(name=微服务提供商用户)公共接口UserFeignClient { @ request mapping(value=/get ,method=RequestMethod .获取)公共用户get2(@RequestParam MapString,对象映射);}多参数的统一资源定位器也可以使用地图去构建。当目标统一资源定位器参数非常多的时候,可使用这种方式简化假装接口的编写。
POST请求包含多个参数
下面我们来讨论如何使用假装构造包含多个参数的邮政请求。举个例子,假设我们的用户微服务的控制器是这样编写的:
@ RestControllerpublic类用户控制器{ @ post映射(/post )公共用户帖子(@RequestBody User用户){.}}我们的假装接口要如何编写呢?答案非常简单,示例:
@ FeignClient(name=微服务提供商用户)公共接口UserFeignClient { @ request mapping(value=/post ,method=RequestMethod .帖子)公共用户帖子(@RequestBody用户用户);}feign接口调用其他微服务中参数是集合对象(ListJava对象)且请求方式是PUT或者POST方式的解决
首先,如果传输的是集合对象,一般的不是放或者邮政请求都是可以用@RequestParam(…)的形式写在接口的新参中,比如
@ get mapping(/find/sec/consume/product/category )公共响应entitylistsecconsumepreproductcategory VO getsecconsumepreproductcategory(@ request param( sellerid s )list long sellerid s){ listsecconsumepreproductcategory VO secconsumepreproductbasebusinessservice。getsecconsumepreproductcategory(sellerid s);返回响应实体。ok(secConsumeProductCategories);}而对于假装调用且参数是集合对象的情况, 在假装客户端,则可以使用如下方式,请求路劲的注解就不能直接使用@PutMapping或者@PostMapping了,而必须使用@RequestMapping,形参仍然使用注解@请求体
@ request mapping(value=/cancel/daily/appointment ,method=RequestMethod .PUT)public Void updateBatchDailyAppointment(@ request body listpddproductdailyappointmentdto cancelapointmentdtos/* String cancelapointmentstr */);而对于被调用方,则可以这样写
@ request mapping(value=/cancel/daily/appointment ,method=RequestMethod .PUT)公共响应entity void updateBatchDailyAppointment(@ request body listpdproductdailyapointmentdto cancelapointdtos/* String cancelapointmentstr */){ pdproductdailyappointmentbusinessservice。updatebatchdailyappointment(cancelapointmentdtos);返回响应实体。状态(http状态.已创建)。build();}这样,就可以解决假装调用传输的是集合对象的问题啦
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行它.
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。