zoukankan      html  css  js  c++  java
  • spring boot 中实现兼容不同的请求类型的方法。

      比如一个接口,既想实现请求参数是application/json,又想实现form提交,改怎么做呢?用postman去测试,发现不可能做到两全其美。

      我有一个方法,就是不用requestbody,也可以实现json解析,首先是新建一个包装类,这个类可以重复读inputstream里面的东西。

      如果加了requestbody,就无法用form提交,如果去掉requestbody 那么就无法获取到json里面的值,因为全是null.

     class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
    
        private final byte[] body;
    
        public BodyReaderHttpServletRequestWrapper(HttpServletRequest request)
                throws IOException {
            super(request);
        //编码默认iso-8859-1 body = StreamUtil.readBytes(request.getReader(), "utf-8"); } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream bais = new ByteArrayInputStream(body); return new ServletInputStream() { @Override public int read() throws IOException { return bais.read(); } @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener listener) { } }; } }

      然后再从inputstream里面拿东西就OK拉

        public static JSONObject receivePost(HttpServletRequest request) throws IOException, UnsupportedEncodingException {
    
            // 读取请求内容
            BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
            String line = null;
            StringBuilder sb = new StringBuilder();
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            //将json字符串转换为json对象
            JSONObject json=JSONObject.parseObject(sb.toString());
            return json;
        }
    

      最后在action里面做判断就OK了,大功告成。

            if(servletRequest.getContentType().equals("application/json"))
            {
                servletRequest= new BodyReaderHttpServletRequestWrapper( servletRequest);
                JSONObject d= receivePost(servletRequest);
            }
            else
            {
               Map<String,String[]> map= servletRequest.getParameterMap();
    
            }
    

      

  • 相关阅读:
    权限系统概要(收集,整理)
    全程参观 Google 总部
    从Excel表格中坐标生成 点线面
    Cross Site Script 知识
    UserControl 实现From_Close
    用后立即调用Dispose
    获取鼠标点击处的颜色
    arcsde9.3 the arcsde repository is not successfully created
    ArcGIS9.3全套 下载地址
    SQLServer 2008 安装 is not a volid login or don't have permission
  • 原文地址:https://www.cnblogs.com/kmsfan/p/spring_boot_requestbody_contenttype.html
Copyright © 2011-2022 走看看