spring 自带@requestParam @requestBody注解可以很方便将参数填充到相应的实体类,但是应用场景不同。其实本质还是由于不同的Content-type ,传输方式不同。
平常请求contentType 一般为 "application/x-www-form-urlencoded"
提交json类型一般都需要设置 application/json
有个需求需要把请求参数都收集起来,故需要自己开发判断多种类型。可以结合 HandlerMethodArgumentResolver 声明个自定义注解支持多种方式。HandlerMethodArgumentResolver demo可参考https://blog.csdn.net/xuyw10000/article/details/89514754
获取参数代码如下
@Slf4j
public class MyRequestParamMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(MyRequestParam.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
JSONObject req = getReqParam(servletRequest);
Class cla = parameter.getParameterType();
return JSON.parseObject(req, cla);
}
public JSONObject getReqParam(HttpServletRequest request) {
String contentType = request.getHeader("Content-Type");
if (StringUtils.isBlank(contentType)) {
contentType = "application/x-www-form-urlencoded";
}
contentType=contentType.toLowerCase();
if (contentType.startsWith("application/json")) {
try {
String json = IOUtils.toString(request.getInputStream(), "utf-8");
return JSON.parseObject(json, Feature.OrderedField);
} catch (Exception e) {
log.error("获取参数异常", e);
return null;
}
}
if (contentType.startsWith("application/x-www-form-urlencoded")) {
return getDataForParameterMap(request);
}
if (contentType.startsWith("multipart/form-data")) {
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
return getDataForParameterMap(multipartRequest);
}
return getDataForParameterMap(request);
}
public JSONObject getDataForParameterMap(HttpServletRequest request) {
Map<String, String[]> parameterMap = request.getParameterMap();
JSONObject jsonObject = new JSONObject();
if (parameterMap == null || parameterMap.size() == 0) {
return jsonObject;
}
for (Map.Entry<String, String[]> m : parameterMap.entrySet()) {
String[] values = m.getValue();
if (values.length > 1) {
jsonObject.put(m.getKey(), values);
} else {
jsonObject.put(m.getKey(), values[0]);
}
}
return jsonObject;
}
}