HttpServletRequest获取HTTP请求的body - ZKUI

Nothing is impossible

HttpServletRequest获取HTTP请求的body

HttpServletRequest得到客户端传来信息的方法,getInputStream() getReader() getParameter(),这三个方法都是从request对象中取得的数据。

1、getInputStream方法返回一个代表实体内容的输入流对象。

2、getReader方法返回一个代表实体内容的BufferedReader对象,实体内容的字节数据按照请求消息中指定的字符集编码转换成文本字符串。可以用setCharacterEncoding方法指定字符集编码。

3、getParameter 方法进行url解码时采用的字符集编码在Servlet规范中没有明确规定采用ISO8859-1因此,无法返回正确的中文参数信息。二进制数据流采用"multipart/form-data",在这种情况下getParameter是得不到数据的。

适用范围

1.当请求消息中的实体内容全部是文本数据,并且Servlet程序也需要以文本方式处理时,适用于getReader方法。如果不处理只是存储到服务器文件系统或者数据库中,应该使用getInputStream。

2.处理文件上传,只能用getInputStream返回的ServletInputStream字节流对象读取实体内容,因为他读取的数据是每个字节的原始内容,而从BufferedReader流对象中读取的数据是原始内容按某种编码转换成的字符文本。
原文:https://blog.csdn.net/fanyun7654/article/details/21704355

注意事项

1.三种方式是冲突的,只能读取一次。重复读取会报 java.io.IOException: Stream closed 异常。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;

public class HttpServletRequestReader
{

    // 字符串读取
    // 方法一
    public static String ReadAsChars(HttpServletRequest request)
    {

        BufferedReader br = null;
        StringBuilder sb = new StringBuilder("");
        try
        {
            br = request.getReader();
            String str;
            while ((str = br.readLine()) != null)
            {
                sb.append(str);
            }
            br.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (null != br)
            {
                try
                {
                    br.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
        return sb.toString();
    }

    // 方法二
    public static void ReadAsChars2(HttpServletRequest request)
    {
        InputStream is = null;
        try
        {
            is = request.getInputStream();
            StringBuilder sb = new StringBuilder();
            byte[] b = new byte[4096];
            for (int n; (n = is.read(b)) != -1;)
            {
                sb.append(new String(b, 0, n));
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (null != is)
            {
                try
                {
                    is.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }

    }

    // 二进制读取
    public static byte[] readAsBytes(HttpServletRequest request)
    {

        int len = request.getContentLength();
        byte[] buffer = new byte[len];
        ServletInputStream in = null;

        try
        {
            in = request.getInputStream();
            in.read(buffer, 0, len);
            in.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (null != in)
            {
                try
                {
                    in.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
        return buffer;
    }
}

原文:https://blog.csdn.net/pengjunlee/article/details/79416687

分享