运维开发网

调优其他微服务时,参数是对象

运维开发网 https://www.qedev.com 2022-09-20 20:44 出处:网络
这篇文章主要介绍了springcloudfeign调其他微服务时参数是对象的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

这篇文章主要介绍了springcloudfeign调其他微服务时参数是对象的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用feign调用其他服务时,发现获得的参数为null。当参数是Object Yes时,它是一个已执行的Post请求,所以在方法参数前添加@RequestBody。


@RequestBody

处理HttpEntity传递的数据,http entity通常用于处理非content-type:application/x-www-form-urlencoded格式的数据。

GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。


GET请求多参数的URL

假设我们请求的URL包含多个参数,比如http://microservice-provider-user/getid = 1 amp;用户名=张三,怎么办?

我们知道Spring Cloud为Feign增加了Spring MVC的注释支持,不妨按照Spring MVC的写法试试:

@FeignClient("microservice-provider-user")public interface UserFeignClient { @RequestMapping(value = "/get", method = RequestMethod.GET) public User get0(User user);}

但是,当我们测试时,我们会发现书写不正确,我们会收到一个类似如下的异常:

假装。FeignException:状态405读取UserFeignClient # get 0(User);内容:
{ quot;timestampquot:1482676142940,quotstatusquot:405,quot错误quot;:quot不允许方法quot;,quot例外quot;:quotorg . spring framework . web . http requestmethodonotsupportedexception quot;,quot消息quot;:quot请求方法# 39;岗位# 39;不支持。,quotpathquot:quot/get quot;}

从异常中可以看出,即使指定了GET方法,Feign仍然会发送POST请求。


正确写法如下

(1)方法1

@FeignClient(name = "microservice-provider-user")public interface UserFeignClient { @RequestMapping(value = "/get", method = RequestMethod.GET) public User get1(@RequestParam("id") Long id, @RequestParam("username") String username);}

这是最直观的方式。URL有几个参数,Feign接口中的方法有几个参数。使用@RequestParam批注指定请求的参数。

(2)方法二

@FeignClient(name = "microservice-provider-user")public interface UserFeignClient { @RequestMapping(value = "/get", method = RequestMethod.GET) public User get2(@RequestParam Maplt;String, Objectgt; map);}

也可以使用Map构建多参数URL。当目标URL参数非常大时,可以用这个方法来简化Feign接口的编写。


POST请求包含多个参数

让我们讨论如何使用Feign构造一个带有多个参数的POST请求。举个例子,假设我们用户微服务的控制器是这样写的:

@RestControllerpublic class UserController { @PostMapping("/post") public User post(@RequestBody User user) { ... }}

我们的Feign接口怎么写?答案很简单,比如:

@FeignClient(name = "microservice-provider-user")public interface UserFeignClient { @RequestMapping(value = "/post", method = RequestMethod.POST) public User post(@RequestBody User user);}

feign接口调用的其他微服务是set对象(List),请求模式是PUT或POST。

首先,如果传输的是一个集合对象,一般不是PUT或POST请求可以使用@ request param(quot;hellipquot)是写在界面的新参数,如

@GetMapping("/find/sec/consume/product/category")public ResponseEntitylt;Listlt;SecConsumeProductCategoryVOgt;gt; getSecConsumeProductCategory(@RequestParam("sellerIds") Listlt;Longgt; sellerIds){ Listlt;SecConsumeProductCategoryVOgt; secConsumeProductCategories = secConsumeProductBaseBusinessService.getSecConsumeProductCategory(sellerIds); return ResponseEntity.ok(secConsumeProductCategories);}

对于feign调用和参数设置对象,在feign client中,可以使用以下方法。您必须使用@RequestMapping,而不是直接使用@PutMapping或@PostMapping,并且注释@RequestBody仍然用于形式参数。

@RequestMapping(value = "/cancel/daily/appointment",method = RequestMethod.PUT)public Void updateBatchDailyAppointment(@RequestBody Listlt;PdProductDailyAppointmentDTOgt; cancelAppointmentDTOS/*String cancelAppointmentStr*/);

对于被叫方,可以这样写

@RequestMapping(value = "/cancel/daily/appointment",method = RequestMethod.PUT)public ResponseEntitylt;Voidgt; updateBatchDailyAppointment(@RequestBody Listlt;PdProductDailyAppointmentDTOgt; cancelAppointmentDTOS/*String cancelAppointmentStr*/){ pdProductDailyAppointmentBusinessService.updateBatchDailyAppointment(cancelAppointmentDTOS); return ResponseEntity.status(HttpStatus.CREATED).build();}

这样就可以解决佯调用传递集合对象的问题。

0

精彩评论

暂无评论...
验证码 换一张
取 消