脚本宝典收集整理的这篇文章主要介绍了SpringBoot解析HTTP参数分析,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
public interface HandlerMethodArgumentResolver { //判断方法参数是否可以被当前解析器解析 boolean supportsParameter(MethodParameter var1); //解析参数 @Nullable Object resolveArgument(MethodParameter var1, @Nullable ModelAndViewContainer var2, NativeWebRequest var3, @Nullable WebDataBinderFactory var4)throws Exception; }
@RequestMapping("/test1") @ResponseBody public String test1(String t1, @RequestParam(name = "t2",required = false) String t2,HttpServletRequest request){ logger.info("参数:{},{}",t1,t2); return "Java"; }
String parameter = request.getParameter("t1");
protected Object resolveName(String name, MethodParameter parameter, NativeWebRequest request) throws Exception { HttpServletRequest servletRequest = request.getNativeRequest(HttpServletRequest.class); //...省略部分代码... if (arg == null) { String[] paramValues = request.getParameterValues(name); if (paramValues != null) { arg = paramValues.length == 1 ? paramValues[0] : paramValues; } } return arg; }
@ResponseBody @RequestMapping("/test2") public String test2(@RequestBody SysUser user){ logger.info("参数信息:{}",JSONObject.toJSONString(user)); return "Hello"; }
@RequestMapping("/test2") @ResponseBody public String test2(HttpServletRequest request) throws IOException { BufferedReader reader = request.getReader(); StringBuilder builder = new StringBuilder(); String line; while ((line = reader.readLine()) != null){ builder.append(line); } logger.info("Body数据:{}",builder.toString()); SysUser sysUser = JSONObject.parseObject(builder.toString(), SysUser.class); logger.info("转换后的Bean:{}",JSONObject.toJSONString(sysUser)); return "Java"; }
protected <T> Object readWithMessageConverters(){ boolean noContentType = false; MediaType contentType; try { contentType = inputMessage.getHeaders().getContentType(); } catch (InvalidMediaTypeException var16) { throw new HttpMediaTypeNotSupportedException(var16.getMessage()); } if (contentType == null) { noContentType = true; contentType = MediaType.APPLICATION_OCTET_STREAM; } Class<?> contextClass = parameter.getContainingClass(); Class<T> targetClass = targetType instanceof Class ? (Class)targetType : null; if (targetClass == null) { ResolvableType resolvableType = ResolvableType.forMethodParameter(parameter); targetClass = resolvableType.resolve(); } HttpMethod httpMethod = inputMessage instanceof HttpRequest ? ((HttpRequest)inputMessage).getMethod() : null; //....... }
public MappingJackson2HttpMessageConverter(ObjectMapper objectMapper) { super(objectMapper, new MediaType[]{ MediaType.APPLICATION_JSON, new MediaType("application", "*+json")}); }
protected <T> Object readWithMessageConverters(){ if (message.hasBody()) { HttpInputMessage msgToUse = this.getAdvice().beforeBodyRead(message, parameter, targetType, converterType); body = genericConverter.read(targetType, contextClass, msgToUse); body = this.getAdvice().afterBodyRead(body, msgToUse, parameter, targetType, converterType); } }
@RequestMapping("/test3") @ResponseBody public String test3(SysUser user){ logger.info("参数:{}",JSONObject.toJSONString(user)); return "Java"; }
http://localhost:8080/test3?id=1001&name=Jack&password=1234&address=北京市海淀区
public String test3(SysUser user,HttpServletRequest request)throws Exception { //从Request中获取所有的参数key 和 value Map<String, String[]> parameterMap = request.getParameterMap(); Iterator<Map.Entry<String, String[]>> iterator = parameterMap.entrySet().iterator(); //获取目标类的对象 Object target = user.getClass().newInstance(); Field[] fields = target.getClass().getDeclaredFields(); while (iterator.hasNext()){ Map.Entry<String, String[]> next = iterator.next(); String key = next.getKey(); String value = next.getValue()[0]; for (Field field:fields){ String name = field.getName(); if (key.equals(name)){ field.setAccessible(true); field.set(target,value); break; } } } logger.info("userInfo:{}",JSONObject.toJSONString(target)); return "Python"; }
private void setProperty(Object target,String key,String value) { try { PropertyDescriptor propDesc = new PropertyDescriptor(key, target.getClass()); Method method = propDesc.getWriteMethod(); method.invoke(target, value); } catch (Exception e) { e.printStackTrace(); } }
while (iterator.hasNext()){ Map.Entry<String, String[]> next = iterator.next(); String key = next.getKey(); String value = next.getValue()[0]; setProperty(userInfo,key,value); }
SysUser user = new SysUser(); BeanWrapper wrapper = new BeanWrapperImpl(user.getClass()); wrapper.setPropertyValue("id","20001"); wrapper.setPropertyValue("name","Jack"); Object instance = wrapper.getWrappedInstance(); System.out.println(instance);
private class BeanPropertyHandler extends PropertyHandler { //属性描述符 private final PropertyDescriptor pd; public void setValue(@Nullable Object value) throws Exception { //获取set方法 Method writeMethod = this.pd.getWriteMethod(); ReflectionUtils.makeAccessible(writeMethod); //设置 writeMethod.invoke(BeanWrapperImpl.this.getWrappedInstance(), value); } }
//模拟Request参数 Map<String,Object> map = new HashMap(); map.put("id","1001"); map.put("name","Jack"); map.put("password","123456"); map.put("address","北京市海淀区"); //将request对象转换为MutablePropertyValues对象 MutablePropertyValues propertyValues = new MutablePropertyValues(map); SysUser sysUser = new SysUser(); //创建数据绑定器 ServletRequestDataBinder binder = new ServletRequestDataBinder(sysUser); //bind数据 binder.bind(propertyValues); System.out.println(JSONObject.toJSONString(sysUser));
@Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestXuner { String name() default ""; boolean required() default false; String defaultValue() default "default"; }
public class XunerArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(RequestXuner.class); } @Override public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory){ //获取参数上的注解 RequestXuner annotation = methodParameter.getParameterAnnotation(RequestXuner.class); String name = annotation.name(); //从Request中获取参数值 String parameter = nativeWebRequest.getParameter(name); return "HaHa,"+parameter; } }
@Configuration public class WebMvcConfiguration extends WebMvcConfigurationSupport { @Override protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(new XunerArgumentResolver()); } }
一顿操作后,在Controller中我们可以这样使用它:
@ResponseBody @RequestMapping("/test4") public String test4(@RequestXuner(name="xuner") String xuner){ logger.info("参数:{}",xuner); return "Test4"; }
以上是脚本宝典为你收集整理的SpringBoot解析HTTP参数分析全部内容,希望文章能够帮你解决SpringBoot解析HTTP参数分析所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。