精华内容
下载资源
问答
  • import java.io.BufferedReader; import java.io.InputStreamReader; import javax.servlet.... ... import org.springframework.boot.autoconfigure.EnableAutoConfiguration;...import org.springframe.
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    import com.alibaba.fastjson.JSONObject;
     
    @RestController
    public class Demo {
     
        
      
        @RequestMapping("/request")
        String request(String value ,HttpServletRequest request, HttpServletResponse response) {
            String param= null; 
            try {
                BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8"));
                StringBuilder responseStrBuilder = new StringBuilder();
                String inputStr;
                while ((inputStr = streamReader.readLine()) != null)
                    responseStrBuilder.append(inputStr);
                
                JSONObject jsonObject = JSONObject.parseObject(responseStrBuilder.toString());
                param= jsonObject.toJSONString();
                System.out.println(param);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return param;
        }
        
        
        
      
    }
    

     

    展开全文
  • 跟外界产品合作对接API的时候,很多时候要求post方式传递json格式的数据。下面简单讲讲处理方式。传递json格式数据的时候,需要注意:1.指定请求后header里面的Content-type的值为application/json。2.传递的值名为...

    跟外界产品合作对接API的时候,很多时候要求post方式传递json格式的数据。下面简单讲讲处理方式。

    传递json格式数据的时候,需要注意:

    1.指定请求后header里面的Content-type的值为application/json。

    2.传递的值名为body,对应的值需要为json格式。

    使用Postman演示

    9c4de2b91f2f748fec78d168e3041e75.png

    b8d686e39c630bd782d4dd668bb50db2.png

    使用php代码演示

    说明:

    本实例依赖composer Guzzle扩展

    composer require guzzlehttp/guzzle

    具体代码:

    /**

    * 发送api请求

    * @param string $api api地址

    * @param array $postData 传递的数据

    * @return mixed|string

    */

    function sendApiRequest(string $api,array $postData)

    {

    $client = new \GuzzleHttp\Client([

    'headers' => [ 'Content-Type' => 'application/json' ]

    ]);

    $response = $client->request('POST',$api,['body' => json_encode($postData),]);

    $result=$response->getBody()->getContents();

    $result = \GuzzleHttp\json_decode($result,true);

    return $result;

    }

    展开全文
  • PostMan发送请求 有两种方式: 已流的方式接收请求参数 // request为HttpServletRequest对象 BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8")...
    • PostMan发送请求

    在这里插入图片描述
    有两种方式:

    1. 已流的方式接收请求参数
    // request为HttpServletRequest对象
    BufferedReader br = null;
    try {
    	br = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
    } catch (IOException e) {
    	e.printStackTrace();
    }
    String line = null;
    StringBuilder sb = new StringBuilder();
    try {
    	while ((line = br.readLine()) != null) {
    		sb.append(line);
    	}
    	br.close();
    } catch (IOException e) {
    	e.printStackTrace();
    }
    
    1. @RequestBody注解 接收
    @RequestMapping(value = "/technicalReviewInfo", method = RequestMethod.POST,produces = "application/json;charset=utf-8")
    @ResponseBody
    public JSONObject synTechnicalReviewInfo(@RequestBody JSONObject technicalReviewJson) {
        JSONObject json=new JSONObject();
        return json;
    }
    
    展开全文
  • 获取GET、POST请求中的参数 获取POST请求中的JSON格式参数

    背景

    最近开发项目,因为有第三方调用我们的接口,我们使用SpringBootJavaBean的方式接收了我们预期的参数,参数接收也没有什么异常。但是有一些需求问题需要沟通,需要拿到合作第三方传入的所有参数,来进行参数核验。

    如何拿到请求的所有参数呢?正常的思路肯定是从request中获取,如果是GET请求,参数在请求路径中拼接;如果是POST请求,参数在request的请求体(body)中。

    一番检索,很容易拿到相关代码。但是经过实操,发现并不能如期获取到参数。经过思考,我的接口是POST请求,参数形式是json格式(使用了@RequestBody来修饰参数)。

    具体过程参看如下分析


    获取请求中的参数(非json格式参数)

    获取方法

    方法一

    Enumeration<String> parameterNames = request.getParameterNames();
    while (parameterNames.hasMoreElements()) {
        String paraName = parameterNames.nextElement();
        System.out.println(paraName + ": " + request.getParameter(paraName));
    }
    

    方法二

    Map<String, String[]> map = request.getParameterMap();
    Set<Map.Entry<String, String[]>> keSet = map.entrySet();
    for (Iterator<Map.Entry<String, String[]>> itr = keSet.iterator(); itr.hasNext(); ) {
        Map.Entry<String, String[]> me = itr.next();
        Object ok = me.getKey();
        Object ov = me.getValue();
        String[] value = new String[1];
        if (ov != null) {
            value = (String[]) ov;
        } else {
            value[0] = ov.toString();
        }
        for (int k = 0; k < value.length; k++) {
            System.out.println(ok + "=" + value[k]);
        }
    }
    

    结论

    经过测试以上两个方法可以获取GET请求的参数,以及参数格式为form-data、x-www-form-urlencoded的POST请求,但是json格式参数(postman中为raw)的参数不能获得

    根据代码的简介程度,选择方法一,明显更舒服一些。

    以上结论经过postman实测.


    获取POST请求json格式的参数

    以上方法已经可以获取大多数情况下的请求的参数,但是明显还不能满足需求,需要获取传入json格式的参数。

    经过检索推荐方法(参看后边完整方法)

    经过一番检索,网上推荐的方法一般都是使用流来进行参数读取,即使用getInputStream()getReader()

    Map<String, Object> params = new HashMap<>();
    BufferedReader br = null;
    try {
        try {
            br = request.getReader();
        } catch (IOException e) {
            e.printStackTrace();
        }
        String str;
        StringBuilder wholeStr = new StringBuilder();
        while ((str = Objects.requireNonNull(br).readLine()) != null) {
            wholeStr.append(str);
        }
        if (StrUtil.isNotEmpty(wholeStr.toString())) {
            params = JSON.parseObject(wholeStr.toString(), Map.class);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println(params);
    

    遇到的问题及解决思路

    问题1 流不能多次被调用

    但是又会遇到如下问题:

    ERROR m.e.handler.GlobalExceptionHandler - getInputStream() has already been called for this request
    java.lang.IllegalStateException: getInputStream() has already been called for this request
    	at org.apache.catalina.connector.Request.getReader(Request.java:1212)
    	at org.apache.catalina.connector.RequestFacade.getReader(RequestFacade.java:504)
    

    根据报错信息分析简单来说,就是getInputStream()已经被调用了,不能再次调用。可是我看代码上,我也没调用。经过一番检索,原来@RequestBody注解配置后,默认会使用流来读取数据。

    具体原因:

    • 默认配置时,getInputStream()getReader()一起使用会报错,使用两遍getInputStream(),第二遍会为空。
    • 当存在@RequestBody等注解时,springMVC已读取过一遍流,默认单独使用getInputStream()getReader()都为空。

    实测,不加@RequestBody注解,可以如期获得请求中的json参数,但是又不得不加@RequestBody注解。这样就需要新的思路


    解决思路

    写filter继承HttpServletRequestWrapper,缓存InputStream,覆盖getInputStream()getReader()方法,使用ByteArrayInputStream is = new ByteArrayInputStream(body.getBytes());读取InputStream


    实现方法

    1.定义增强类,继承继承HttpServletRequestWrapper

    将请求体中的流copy一份,覆写getInputStream()getReader()方法供外部使用。每次调用覆写后的getInputStream()方法都是从复制出来的二进制数组中进行获取,这个二进制数组在对象存在期间一直存在,这样就实现了流的重复读取。

    public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
    
        private byte[] body;
    
        public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
            super(request);
            body = HttpHelper.getBodyString(request).getBytes(StandardCharsets.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 readListener) {
    
                }
    
            };
        }
    
        public void setInputStream(byte[] body) {
            this.body = body;
        }
    }
    
    

    2.构建过滤器

    @Slf4j
    @WebFilter(filterName = "RequestWrapperFilter", urlPatterns = "/api/test/test2")
    public class RequestWrapperFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException
                , IOException {
            ServletRequest requestWrapper = null;
            if (request instanceof HttpServletRequest) {
                requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
            }
            if (null == requestWrapper) {
                log.error("过滤器包装request失败!将返回原来的request");
                chain.doFilter(request, response);
            } else {
                log.info("过滤器包装request成功");
                chain.doFilter(requestWrapper, response);
            }
        }
    
        @Override
        public void destroy() {
    
        }
    
    }
    

    注意事项:

    1. 使用@WebFilter注解的urlPatterns属性,可指定过滤哪一个接口方法。
    2. 过滤器类最好不要交由Spring管理,否则每一个接口都会进行过滤(实测)。例如:不要添加@Component注解.

    3.编写工具类方便调用

    /**
     * description:http辅助工具类
     *
     * @author RenShiWei
     * Date: 2021/5/7 22:11
     **/
    public class HttpHelper {
    
        /**
         * description:从request获取body的json数据
         *
         * @param request /
         * @return /
         * @author RenShiWei
         * Date: 2021/5/7 22:44
         */
        public static String getBodyString(ServletRequest request) {
            StringBuilder sb = new StringBuilder();
            ServletInputStream inputStream = null;
            BufferedReader reader = null;
            try {
                inputStream = request.getInputStream();
                reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
                String line = "";
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return sb.toString();
        }
    
        /**
         * description:从request获取body的json数据,并格式化成map形式
         *
         * @param request /
         * @return /
         * @author RenShiWei
         * Date: 2021/5/7 22:44
         */
        @SuppressWarnings("all")
        public static Map<String, Object> getBodyMap(ServletRequest request) {
            Map<String, Object> params = new HashMap<>();
            String bodyString = getBodyString(request);
            if (StrUtil.isNotEmpty(bodyString)) {
                params = JSON.parseObject(bodyString, Map.class);
            }
            return params;
        }
    
    }
    
    
    

    4.在SpringBoot启动类上添加@ServletComponentScan注解

    在这里插入图片描述


    使用

    @RestController
    @RequestMapping("/api/test")
    public class TestController {
    
        @GetMapping("/test1")
        @AnonymousAccess
        public ResponseEntity<String> test1(HttpServletRequest request) {
            System.out.println("---GET请求 getParameterNames 入参---");
            try {
                request.setCharacterEncoding("utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            Enumeration<String> parameterNames = request.getParameterNames();
            while (parameterNames.hasMoreElements()) {
                String paraName = parameterNames.nextElement();
                System.out.println(paraName + ": " + request.getParameter(paraName));
            }
    
            System.out.println("---GET请求 getParameterMap 入参---");
            Map<String, String[]> map = request.getParameterMap();
            Set<Map.Entry<String, String[]>> keSet = map.entrySet();
            for (Iterator<Map.Entry<String, String[]>> itr = keSet.iterator(); itr.hasNext(); ) {
                Map.Entry<String, String[]> me = itr.next();
                Object ok = me.getKey();
                Object ov = me.getValue();
                String[] value = new String[1];
                if (ov != null) {
                    value = (String[]) ov;
                } else {
                    value[0] = ov.toString();
                }
                for (int k = 0; k < value.length; k++) {
                    System.out.println(ok + "=" + value[k]);
                }
            }
    
            return ResponseEntity.ok(null);
        }
    
        @PostMapping("/test2")
        @AnonymousAccess
        public ResponseEntity<String> test2(@RequestBody TestParam testParam, HttpServletRequest request) {
            String body = HttpHelper.getBodyString(request);
            Map<String, Object> bodyMap = HttpHelper.getBodyMap(request);
            System.out.println("body: " + body);
            System.out.println("bodyMap: " + bodyMap);
    
            return ResponseEntity.ok(null);
        }
    
    }
    
    

    postman测试

    1. GET请求
      在这里插入图片描述
    2. POST的JSON格式参数(其他方式结果与GET请求结果一致)
      在这里插入图片描述
      在这里插入图片描述

    结果

    在这里插入图片描述

    参考

    展开全文
  • sqlmap进行注入时,如果接口post方式,body是json方式时,有2种方式 方式1:文件方式 可以通过burp suite 来抓 接口请求的数据,将数据保存到 文件中。 然后使用 sqlmap来执行注入,举例: python .\sqlmap.py -r "C...
  • charset=UTF-8", //设置JSON字符串格式 dataType : 'JSON', success : function(result) { console.log(result) } }); } //1、后端使用对应的对象接收参数 @ResponseBody @RequestMapping("/...
  • try{/** * 尝试将接口返回的数据转换成json格式 * 接口正常情况下返回的数据流的形式,转成json数据肯定会报错。 * catch捕获后执行文件下载。 * * 假如能够顺利转成json,说明接口是报错状态,返回的是错误数据*/to...
  • json官方给出了第二个参数用来格式化样式。 /* 缓存 */ $sText = ' '.json_encode($aDataList, JSON_PRETTY_PRINT|JSON_FORCE_OBJECT); JSON_FORCE_OBJECT起到强制转换成对象的作用,防止关联数组在无值时转
  • 传递的是JSON格式没有错,但还是报错 加上这个,问题解决
  • {}表示对象,[]可以表示list集合 Date类型的参数 传入形如:2021/11/11 11:11:11格式
  • // 接口测试-处理json格式的post请求 public static String doPostJson(String url,String json) { // 创建连接池 CloseableHttpClient closeableHttpClient = HttpClients.createDefault(); ...
  • } } /* * 第五种:以JSON对象接收 * {"username": "zhangsan","id":"2","role":{"rolename":"admin"}} * */ @RequestMapping(value = "/test5",method=RequestMethod.POST) public void test5(@RequestBody ...
  • 接到一个对接json格式参数的webservice接口的任务,很久没做过webservice相关并且以前也只做过xml格式参数,所以对此做了一些了解。 1、定义一个webservice服务端接口 1.1创建一个springboot项目(略) 1.2添加cxf依赖...
  • 后端接口以Json格式传参

    千次阅读 2021-07-23 16:32:50
    produces=MediaType.APPLICATION_JSON_VALUE:表示将生产json格式的数据,此时根据请求头中的Accept进行匹配,如请求头“Accept:application/json”时即可匹配 value={"/xxx"}:表示接口的地址 @ResponseBody 然后...
  • //发送参数json格式的post请求 public static String doPost1(String url, Map<String, Object> paramMap) { CloseableHttpClient httpClient = null; CloseableHttpResponse httpResponse = null; ...
  • 采用HttpURLConnection的POST方式发送JSON格式的数据 /** *方法说明: * @param url * @param jsonDataStr * jsonDataStr:"{field:value}" */ private void sendData(String url, String jsonDataStr) ...
  • postman请求的方式如图: 图一是地址后面拼接的参数: 图二是携带认证的参数: 图三是json格式的传参: 后端Java代码接收方法截图如下:
  • 在post传递参数时,如果要传入的参数比较复杂(多级嵌套),则可以使用json格式
  • 用Postman直接请求是没问题的,如下图: 控制台打印的日志: 但是不知道为啥页面上请求超时,报错400: 后台无法接收到json格式参数,如下图: 报错信息: Proxy error: Could not proxy request /api// from ...
  • 很简单就一行:headers:{"Content-Type":"application/json"} headers: { "Content-Type": "application/json" }
  • .format只适合格式一层{}的参数,下面用%格式json格式参数 req_data = {'bdcqzh': '1234', 'xm': 'lisi', 'get_token': '1233445','sfzhm': '4111111111111'} data_request = { "token": "%(get_token)s", ...
  • Jmeter如何添加Json格式的入参

    千次阅读 2021-01-20 18:35:23
    添加,名称:Content-Type,格式:application/json,如下图: 2、线程组,右键添加–》取样器–》HTTP请求: 把json格式的入参放到“消息体数据”,”HTTP请求“选post,,如下图: 3、最后一步,将”HTTP信息头...
  • //json格式 $.ajax({ type:"post", async:false,//Ajax中的async用于控制(false)同步和(true)异步,默认的是true,即请求默认的是异步请求 url:"/demo/handlejson", dataType: "jso
  • 第三方系统提供了https接口服务地址,并且规定接收数据类型为JSON格式。拿到需求我就开始修改原有的新添加使用户接口,在新添加使用户成功后,添加代码发送请求给第三方系统同步使用户信息。下面将详细讲解步骤。...
  • 参数类型为json的时候,通过 getRequestAttributes().getRequest().getParameterMap()获取不到参数。 解决方法 使用joinPoint.getArgs()方法,具体如下 JSONObject.toJSONString(joinPoint.getArgs()); ...
  • python读取json格式的超参数 json文件: { "full_finetuning": true, "max_len": 180, "learning_rate": 3e-5, "weight_decay": 0.01, "clip_grad": 2, "batch_size": 30, "epoch_num": 20, "min_epoch_...
  • 1.使用postman使用post方式传参数{“mkl”:”olil”,”ko”:”878”}后台接收根据其他写的方法稍作修改修改前/*** 取Request中的数据对象* @param valueType* @return* @throws Exception*/protected T ...
  • @RequestMapping("/test") @ResponseBody public AjaxJson test(@RequestBody JSONObject body){ ... // 判断JSON中包含的num参数是否合法 if (body.containsKey("id") || body.containsKey("name").
  • public classPostUtil {/*** 发送post请求 *@paramurl 请求地址 *@paramjson json格式字符串 *@paramcontentType 这里用 "application/json" *@return */ public staticString post(String url, String json, String...
  • 前一段工作中一个python项目有一个小需求,要通过命令行向程序传递json格式参数。这里分享一下实现的心得,主要是两部分:1.使用argparse来获取命令行参数:argparse是是Python标准库中推荐使用的编写命令行程序的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 798,362
精华内容 319,344
关键字:

json格式参数