前言:
而今各位老铁们对“post请求参数放在url里”大约比较重视,小伙伴们都需要剖析一些“post请求参数放在url里”的相关知识。那么小编同时在网络上汇集了一些对于“post请求参数放在url里””的相关知识,希望姐妹们能喜欢,看官们快快来了解一下吧!使用过微服务的架构,遇到最常见的场景一般都是服务之间的相互调用,而使用Spring-Cloud微服务架构的框架一般使用feign进行调用,下面就是feign调用参数声明的标准写法描述,如果使用方式不当或者不正确,或多或少会出现如下类似问题:
问题一:
Caused by: java.lang.IllegalStateException: Method has too many Body parameters问题二:
RequestParam.value() was empty on parameter 0
feign生产者提供方法参数声明
场景GET/POST简单参数传递
key/value 类型,则无需为该参数设置 @RequestParam 注解,多个参数同样如此
@RequestMapping(value = "/hello",method = RequestMethod.GET) BetaDto hello2(@RequestParam("name") String name,@RequestParam("name1") String name1);场景POST复杂类型传递,需要接受对象进行传递
需要接受复杂数据格式类型,如Json对象参数显示的指定@RequestBody注解
@PostMapping("/app/goods/goodsSalesAndStockUpdate") String goodsSalesAndStockUpdate(@RequestBody List<GoodCountDto> goodCountDto);
实际中方式1和方式2能满足99%的业务创建需求,二区说下区别:
使用@RequestBody的用于Post请求使用@RequestParam用于URL多个个参数值传递,用于Get请如果如果请求的参数值过长,使用Post请求方式
扩展,复杂方式调用Post请求Feign提供者
有一个场景是A服务调用B服务接口,B服务接口的申明如下:
@PostMapping("/payOrder")public String payOrder(HttpServletResponse response, @DecryptParam String parameters, HttpServletRequest request){ //........ String osType = request.getHeader("osType"); String osVersion = request.getHeader("osVersion"); payRequest.setOsType(osType); payRequest.setOsVersion(osVersion); return ...}
一般我们调用Feign声明的方法如下:
@PostMapping("/app/pay/payOrder")String payOrder(@RequestParam("parameters") String parameters);
这样就有一个问题,生产者中的header接受不到,数据传输就会有问题。如何解决了?那就是使用MultiValueMap,光使用他也不行,如果生产者返回信息在Response的header中的,又得使用feign.Response来接受返回值。所以Feign正确的申请方式如下:
@PostMapping("/app/pay/payOrder")feign.Response payOrder(@RequestParam("parameters") String parameters, @RequestHeader MultiValueMap<String, String> headers);
业务中MultiValueMap的使用如下:
MultiValueMap<String, String> headers = new HttpHeaders();headers.add("key", SecretText[0]);headers.add("PAY_TOKEN", token);Response response = vipClient.payOrder(SecretText[1], headers);LinkedList list = (LinkedList) response.headers().get("code");int code = Integer.valueOf((String) list.get(0)).intValue();if (code == 1) { String responseMsg = response.body().toString(); String message = JSONUtil.parseObj(responseMsg).getStr("message"); throw new BusinessException(message);}
支持Feign调用参数之间的传输几种方式解释完毕!
调用不难,基础很重要!
标签: #post请求参数放在url里