zoukankan      html  css  js  c++  java
  • springboot 使用 spring cloud feign 过程中,对application/xwwwformurlencoded 编码格式 转发过程碰到的问题。

    问题一: springboot 控制器使用 实体 接受 application/x-www-form-urlencoded 编码格式 的参数

    默认接收参数,只能使用@RequestParam Map 或者 @RequestParam("id") Integer id 这样的参数方式,蛋疼的扣脚
    解决方式就是增加 自定义Resolver实现 HandlerMethodArgumentResolver 接口,在resolveArgument 的时候 判定 当前请求的 Content-Type,当为 "application/x-www-form-urlencoded "时, 用ServletModelAttributeMethodProcessor来解析;
    代码如下:

    public class XXXXXResolver implements HandlerMethodArgumentResolver {
        private ServletModelAttributeMethodProcessor modelProcessor;
        .
        .
        .
     @Override
        public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
                                      NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory){
    
            String contentType = request.getContentType();
            if (MediaType.APPLICATION_FORM_URLENCODED_VALUE.equals(contentType)) {
               return servletModelAttributeMethodProcessor.resolveArgument(methodParameter,
                        modelAndViewContainer, nativeWebRequest, webDataBinderFactory);
            }
        }
    }
    

    问题二: spring cloud openfeign 传递String字符串过长(65534)导致 414 问题

    理论上的Post请求是没长度限制,但是在application/x-www-form-urlencoded中,这个限制还是存在的;
    这个坑爹问题,老生常谈,你想用实体 去请求完成,在"application/x-www-form-urlencoded" 中就是比较扯淡了, 解决办法 参数使用 类型 转换 为 MultiValueMap
    至于为什么,就是在于 这个 类型能拼接参数 例如 :a=1&a=2

    问题三: openfeign 传递 application/x-www-form-urlencoded 收不到参数 的问题

    跟问题二有点儿关系 完整请求

    @PostMapping(value = "/giaogiaogiaogiao", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    ResponseData logo(@RequestBody MultiValueMap<String, String> data);
    

    都是个人的工作总结经验,不一定准确,只为了自己的技能积累。

  • 相关阅读:
    Python对JSON的操作 day3
    Python 文件操作 day2
    Python 字符串常用方法 day2
    Python字典 day2
    Python基础学习(day1)
    Excel图表转成图片
    hadoop —— MapReduce:统计访问所有独立IP个数 、 统计网站子目录访问次数 、 统计每个IP访问的子目录数
    Java -D命令对应的代码中获取-D后面的参数 和 多个参数时-D命令的使用
    hadoop —— teragen & terasort
    C# 计时器 以“天时分秒毫秒”形式动态增加显示
  • 原文地址:https://www.cnblogs.com/akashicbrother/p/14473285.html
Copyright © 2011-2022 走看看