springboot 使用 spring cloud feign 过程中,对application/x-www-form-urlencoded 编码格式 转发过程碰到的问题。
问题一: 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);