欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring MVC 获取请求体 博客分类: spring MVC 请求参数请求要素request stringrequest bodyspringMVC获取请求体 

程序员文章站 2024-02-24 08:49:12
...

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

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

通过如下方法:

/**
	 * Compatible with GET and POST
	 * 
	 * @param request
	 * @return : <code>String</code>
	 * @throws IOException
	 */
	public static String getRequestQueryStr(HttpServletRequest request,
			String charEncoding) throws IOException {
		String submitMehtod = request.getMethod();
		if (submitMehtod.equalsIgnoreCase("post")) {
			byte[] bytes = getRequestPostBytes(request);
			String charEncoding2 = request.getCharacterEncoding();// charset
			System.out.println("[getRequestQueryStr]charEncoding:"
					+ charEncoding2);
			System.out.println("[getRequestQueryStr]Content-Type:"
					+ request.getHeader(Constant2.REQUEST_HEADER_CONTENT_TYPE));

			if(ValueWidget.isNullOrEmpty(charEncoding)){
				charEncoding=SystemHWUtil.CHARSET_UTF;
			}
			return new String(bytes, charEncoding);
		} else {// form method :Get
			return request.getQueryString();
		}
	}

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

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

怎么办呢?

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

@ResponseBody
	@RequestMapping(value = "/jsonStub", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
	public String json(Model model, HttpSession session,@RequestBody byte[]bytes,
			HttpServletRequest request, String callback) throws IOException {
		Map map=WebServletUtil.parseRequest(request, null);
		if(ValueWidget.isNullOrEmpty(map)){
			String postStr=new String(bytes,SystemHWUtil.CURR_ENCODING);//username=huangwei&password=123
			System.out.println("postStr:"+postStr);//username=%E9%BB%84%E5%A8%81&password=123
			postStr=URLDecoder.decode(postStr,SystemHWUtil.CURR_ENCODING);//{"username":"黄威","password":"123"}
			map=WebServletUtil.parseRequestStr(postStr, true);
		}
		String content = HWUtils.getJsonP(map, callback);
		return content;
	}

 

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

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

上述代码依赖的方法:

/***
	 * Get request query string, form method : post
	 * 
	 * @param request
	 * @return byte[]
	 * @throws IOException
	 */
	public static byte[] getRequestPostBytes(HttpServletRequest request)
			throws IOException {
		int contentLength = request.getContentLength();
		/*当无请求参数时,request.getContentLength()返回-1 */
		if(contentLength<0){
			return null;
		}
		byte buffer[] = new byte[contentLength];
		for (int i = 0; i < contentLength;) {

			int readlen = request.getInputStream().read(buffer, i,
					contentLength - i);
			if (readlen == -1) {
				break;
			}
			i += readlen;
		}
		return buffer;
	}

	/***
	 * Get request query string, form method : post
	 * 
	 * @param request
	 * @return
	 * @throws IOException
	 */
	public static String getRequestPostStr(HttpServletRequest request)
			throws IOException {
		byte buffer[] = getRequestPostBytes(request);
		String charEncoding = request.getCharacterEncoding();
		if (charEncoding == null) {
			charEncoding = "UTF-8";
		}
		return new String(buffer, charEncoding);
	}

 

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