java通过HttpServletRequest获取post请求中的body内容

     在java web应用中,我们如何获取post请求body中的内容?以及需要注意的问题。
    通常利用request获取参数可以直接通过req.getParameter(name)的方式获取url上面或者ajax data提交上来的参数。但是body是没有名字的,无法通过参数名字这种方式获取。这时候需要用到io流的方式来获取body中的内容。
    这里先贴出一段代码:

package com.lenovo.servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.alibaba.dubbo.common.utils.IOUtils;
import com.lenovo.service.BusinessService;
import com.lenovo.utils.WebContext;
public class BusinessServlet extends HttpServlet{
	public static final Logger log = Logger.getLogger(BusinessServlet.class);
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static BusinessService service;
	static{
		service = (BusinessService) WebContext.getBean("businessService");		
	}
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		
		BufferedReader reader = new BufferedReader(new InputStreamReader(req.getInputStream()));
		String body = IOUtils.read(reader);
		String name = req.getParameter("name");
		if(StringUtils.isNotBlank(body)){
			log.info("business receive somthing with body :"+body);
		}
		res.setCharacterEncoding("UTF-8");
		res.setContentType("application/json");
		res.setStatus(HttpServletResponse.SC_OK);
		res.getWriter().println(service.getName(name));
	}
	
}
     在这段代码doPost方法中,用到了IO流来获取post提交的body,这样我们就获取了客户端提交的参数。

     需要注意的是:获取body参数,需要在request.getParameter()方法之前调用(如果有需要取QueryString参数的话),因为一旦调用了getParameter()方法之后,再通过IO流的方式获取body参数就失效了(亲测返回"")。

     另外,这里使用了dubbo-2.5.3.jar的IOUtils.read(reader)方法来读取post body的内容。

Java使用HttpURLConnection或Apache HttpClient等类库向服务器发送POST请求会附带请求体(Body),请求包含了客户端发送给服务器的数据,有时客户端需要从请求获取数据,做额外的处理。使用HttpServlet编写服务端的时候,获取请求的数据可以通过ServletRequest对象来实现。 HttpServletRequest对象是Servlet处理请求时的参数,其包含了请求头、请求方法、请求参数等信息。请求体的数据也可以通过HttpServletRequest对象来获取。 首先要理解HTTP请求的格式,分为请求头和请求体两部分。请求包含了HTTP请求的基本信息,例如请求方法、URI、协议版本、Cookies、Headers等信息。请求包含了请求的实体主体。对于GET请求请求体是空的;而对于POST请求请求一般存放以表单形式提交的数据,数据的格式有多种,例如JSON、XML、x-www-form-urlencoded等。 通过HttpServletRequest对象的getInputStream()方法可以获取请求体的InputStream,然后将InputStream转化为字符串即可获取请求内容。 下面是一个示例代码: ``` protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { BufferedReader reader = request.getReader(); StringBuilder stringBuilder = new StringBuilder(); char[] buffer = new char[1024]; int bytesRead; while ((bytesRead = reader.read(buffer)) != -1) { stringBuilder.append(buffer, 0, bytesRead); } String requestBody = stringBuilder.toString(); System.out.println(requestBody); } ``` 对于读取输入流的方法还有request.getReader()。建议使用getReader()获取字符流,getInputStream()获取字节流。 注意:不要同时使用request.getInputStream()和request.getReader()两种方法获取请求体,因为ServletRequest对象只能获取一次输入流。如果先通过getInputStream()获取了输入流,再通过getReader()获取字符流时就会抛出异常。如果需要在业务逻辑多次读取请求体,可以先将读取的数据保存在一个变量
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值