spring MVC 获取请求体

简介:

在spring  MVC中如何获取请求体呢?

在spring MVC中如何获取请求要素呢?

通过如下方法:

Java代码   收藏代码
  1. /** 
  2.      * Compatible with GET and POST 
  3.      *  
  4.      * @param request 
  5.      * @return : <code>String</code> 
  6.      * @throws IOException 
  7.      */  
  8.     public static String getRequestQueryStr(HttpServletRequest request,  
  9.             String charEncoding) throws IOException {  
  10.         String submitMehtod = request.getMethod();  
  11.         if (submitMehtod.equalsIgnoreCase("post")) {  
  12.             byte[] bytes = getRequestPostBytes(request);  
  13.             String charEncoding2 = request.getCharacterEncoding();// charset  
  14.             System.out.println("[getRequestQueryStr]charEncoding:"  
  15.                     + charEncoding2);  
  16.             System.out.println("[getRequestQueryStr]Content-Type:"  
  17.                     + request.getHeader(Constant2.REQUEST_HEADER_CONTENT_TYPE));  
  18.   
  19.             if(ValueWidget.isNullOrEmpty(charEncoding)){  
  20.                 charEncoding=SystemHWUtil.CHARSET_UTF;  
  21.             }  
  22.             return new String(bytes, charEncoding);  
  23.         } else {// form method :Get  
  24.             return request.getQueryString();  
  25.         }  
  26.     }  

 对GET请求的参数是没有问题的,但是对于POST请求获取不到为什么呢?

因为spring MVC已经获取了一遍request的stream,所以再次获取时是为空的,(这是输入流的特性,可以查查官网API),所以我获取到request 的InputStream之后调用reset,但是报错,不支持reset操作.

怎么办呢?

在spring MVC 的控制器中使用@RequestBody 注解,作用是获取请求体,格式是字节数组,见代码

Java代码   收藏代码
  1. @ResponseBody  
  2.     @RequestMapping(value = "/jsonStub", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)  
  3.     public String json(Model model, HttpSession session,@RequestBody byte[]bytes,  
  4.             HttpServletRequest request, String callback) throws IOException {  
  5.         Map map=WebServletUtil.parseRequest(request, null);  
  6.         if(ValueWidget.isNullOrEmpty(map)){  
  7.             String postStr=new String(bytes,SystemHWUtil.CURR_ENCODING);//username=huangwei&password=123  
  8.             System.out.println("postStr:"+postStr);//username=%E9%BB%84%E5%A8%81&password=123  
  9.             postStr=URLDecoder.decode(postStr,SystemHWUtil.CURR_ENCODING);//{"username":"黄威","password":"123"}  
  10.             map=WebServletUtil.parseRequestStr(postStr, true);  
  11.         }  
  12.         String content = HWUtils.getJsonP(map, callback);  
  13.         return content;  
  14.     }  

 

@RequestBody后紧跟的参数将被注入请求体的字节数组(spring mVC帮我们完成的).

注意:request.getInputStream() 读取一次之后,再次读取就读取不到

上述代码依赖的方法:

Java代码   收藏代码
  1. /*** 
  2.      * Get request query string, form method : post 
  3.      *  
  4.      * @param request 
  5.      * @return byte[] 
  6.      * @throws IOException 
  7.      */  
  8.     public static byte[] getRequestPostBytes(HttpServletRequest request)  
  9.             throws IOException {  
  10.         int contentLength = request.getContentLength();  
  11.         /*当无请求参数时,request.getContentLength()返回-1 */  
  12.         if(contentLength<0){  
  13.             return null;  
  14.         }  
  15.         byte buffer[] = new byte[contentLength];  
  16.         for (int i = 0; i < contentLength;) {  
  17.   
  18.             int readlen = request.getInputStream().read(buffer, i,  
  19.                     contentLength - i);  
  20.             if (readlen == -1) {  
  21.                 break;  
  22.             }  
  23.             i += readlen;  
  24.         }  
  25.         return buffer;  
  26.     }  
  27.   
  28.     /*** 
  29.      * Get request query string, form method : post 
  30.      *  
  31.      * @param request 
  32.      * @return 
  33.      * @throws IOException 
  34.      */  
  35.     public static String getRequestPostStr(HttpServletRequest request)  
  36.             throws IOException {  
  37.         byte buffer[] = getRequestPostBytes(request);  
  38.         String charEncoding = request.getCharacterEncoding();  
  39.         if (charEncoding == null) {  
  40.             charEncoding = "UTF-8";  
  41.         }  
  42.         return new String(buffer, charEncoding);  
  43.     }  

 

参考:http://json20080301.iteye.com/blog/1874074?utm_source=tuicool

相关文章
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
1038 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
1723 0
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
1091 0
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
1080 0
|
12月前
|
缓存 监控 Java
《深入理解Spring》拦截器(Interceptor)——请求处理的艺术
Spring拦截器是Web开发中实现横切关注点的核心组件,基于AOP思想,可在请求处理前后执行日志记录、身份验证、权限控制等通用逻辑。相比Servlet过滤器,拦截器更贴近Spring容器,能访问Bean和上下文,适用于Controller级精细控制。通过实现`HandlerInterceptor`接口的`preHandle`、`postHandle`和`afterCompletion`方法,可灵活控制请求流程。结合配置类注册并设置路径匹配与执行顺序,实现高效复用与维护。常用于认证鉴权、性能监控、统一异常处理等场景,提升应用安全性与可维护性。
|
12月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
12月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
964 0
|
JSON 前端开发 Java
Spring MVC 核心组件与请求处理机制详解
本文解析了 Spring MVC 的核心组件及请求流程,核心组件包括 DispatcherServlet(中央调度)、HandlerMapping(URL 匹配处理器)、HandlerAdapter(执行处理器)、Handler(业务方法)、ViewResolver(视图解析),其中仅 Handler 需开发者实现。 详细描述了请求执行的 7 步流程:请求到达 DispatcherServlet 后,经映射器、适配器找到并执行处理器,再通过视图解析器渲染视图(前后端分离下视图解析可省略)。 介绍了拦截器的使用(实现 HandlerInterceptor 接口 + 配置类)及与过滤器的区别
1358 0
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
430 0