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();
    
            }
    

      

  • 相关阅读:
    javascript 函数和对象
    考研总结
    在禁用UAC时无法激活此应用
    工作流--JBPM任务管理
    工作流--JBPM流程管理
    数据结构--快速排序
    error C2143:语法错误:缺少";"(在“类型”的前面)
    工作流--JBPM部署对象
    工作流--JBPM核心ProcessEngine
    工作流--JBPM(二) 简单的流程演示
  • 原文地址:https://www.cnblogs.com/kmsfan/p/spring_boot_requestbody_contenttype.html
Copyright © 2011-2022 走看看