zoukankan      html  css  js  c++  java
  • 如何从HttpServletRequest中拿到前端以application/json形式传输的body中的json串

    背景吐槽

    这个问题是笔者在维护一个祖传老项目的时候遇到的问题,项目中接收数据的类都是最原生的servlet类,里面的方法都是doPost,doGet,总之是个头大的祖传老项目。。。。

    问题

    由于需要前端上传一些比较大的json数据串,这种情况下如果用GET方法,然后再servlet中的doGet()方法中使用request.getParameter("字段名")的话是拿不到数据的,
    再者如果json串比较复杂而且比较大,使用get方式会直接报错400。所以只能使用POST请求方式了,那么这种情况下如何从HttpServletRequest中拿到body中的json串呢?
    下面看解决方法和代码。

    解决方法

    这里用到的是缓冲字符流(因为我们的Json串都是文字字符之类的,所以使用字符流比使用字节流更好),示例代码如下:

    @WebServlet(name = "testServlet", urlPatterns = "/api/testServlet")
    public class TestServlet extends HttpServlet {
        private Gson gson = new Gson();
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    
            //自定义从bodyt中获取json格式数据
            StringBuffer sb = new StringBuffer();
            String line = null;
            try {
                BufferedReader reader = request.getReader();
                while ((line = reader.readLine()) != null)
                    sb.append(line);
            } catch (Exception e) { /*report an error*/ }
            //将空格和换行符替换掉避免使用反序列化工具解析对象时失败
            String jsonString = sb.toString().replaceAll("\s","").replaceAll("
    ","");
            //下面就可以使用如GSON或FastJson之类的工具解析成自己的对象数据并做后续的业务逻辑处理了
            ......
            ........
            返回结果
            PrintWriter out = response.getWriter();
            out.write("success");
            out.close();
        }
    
  • 相关阅读:
    合并项目(Project)
    Table.Group分组…Group(Power Query 之 M 语言)
    日程表(Project)
    判断存在…Contains…(Power Query 之 M 语言)
    批量打印本文件夹内除本工作簿以外所有工作簿的第一个工作表
    断舍离与“优秀”推销员
    JS中的let变量
    JavaScript中typeof正确使用
    JavaScript基础学习(一)
    Write an ASP.NET MVC Web app to get Outlook mail, calendar, and contacts
  • 原文地址:https://www.cnblogs.com/kuangdw/p/13393964.html
Copyright © 2011-2022 走看看