美文网首页spring
POST/GET请求中RequestBody和RequestPa

POST/GET请求中RequestBody和RequestPa

作者: 墨色尘埃 | 来源:发表于2017-12-17 14:21 被阅读0次

    POST请求时
    @RequestBody --> JSON字符串部分
    @RequestParam --> 请求参数部分
    application/json格局图

    图一.png
    form-data、x-www-form-urlencoded格局图
    图二.png

    1、从content-type方面总结:
    ① form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParam。见postman的格局,这两种方式的时候没有json字符串部分。
    ② application/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam。见postman的格局

    2、从两种注解方式总结:
    @RequestBody

    (@RequestBody Map map)
    (@RequestBody Object object)
    application/json时候可用
    form-data、x-www-form-urlencoded时候不可用
    

    @RequestParam

    (@RequestParam Map map)
    application/json时候,json字符串部分不可用,url中的?后面添加参数即可用,见图一
    form-data、x-www-form-urlencoded时候可用,但是要将Headers里的Content-Type删掉
    
    (@RequestParam String waterEleId,
    @RequestParam String enterpriseName)
    application/json时候,json字符串部分不可用,url中的?后面添加参数即可用,见图一
    form-data、x-www-form-urlencoded时候可用,且参数可以没有顺序(即前端传过来的参数或者url中的参数顺序不必和后台接口中的参数顺序一致,只要字段名相同就可以),但是要将Headers里的Content-Type删掉
    
    (@RequestParam Object object)
    不管application/json、form-data、x-www-form-urlencoded都不可用
    

    既不是@RequestBody也不是@RequestParam,没有指定参数哪种接收方式

    (Map map)
    (Object object)
    application/json时候:json字符串部分不可用,url中的?后面添加参数不可用。
    因为没有指定,它也不知道到底是用json字符串部分还是?后面添加参数部分,所以干脆都不可以用
    form-data、x-www-form-urlencoded时都不可用,见图二
    
    (HttpServletRequest request)
    application/json不可用
    form-data、x-www-form-urlencoded时可用
    

    GET请求
    @RequestBody

    RequestBody -- Map / Object
    GET请求中不可以使用@RequestBody
    

    @RequestParam

    (@RequestParam Map map)
    在url中的?后面添加参数即可使用
    
    (@RequestParam String waterEleId,
    @RequestParam String enterpriseName)
    在url中的?后面添加参数即可使用
    
    (@RequestParam Object object)
    GET请求中不可以使用
    

    当使用GET请求时,通过postman添加?后面的参数,不用在url中自己一个一个拼,点击Params,在下面key-value中输入就自动拼接到url中


    GET请求问号后添加参数.png

    举栗子
    上传文件,包含了图中圈出来的两部分

    图二.png
    如果这样,没有@RequestParam,那么url?后的参数就拿不到
    @RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
        public ResponseObj<Boolean> leadingIn(Map formData,
                                              HttpServletRequest request,
                                              Map<String, InputStream> files) {
    }
    

    如果control中这样接收,本来想formData只接收url?后的参数,结果将{ "retCode": null, "data": true }这部分内容也拿到了,真实意外之喜。字符串这部分内容还可以从request中取到,见下面完整方法。

    @RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
        public ResponseObj<Boolean> leadingIn(@RequestParam Map formData,
                                              HttpServletRequest request,
                                              Map<String, InputStream> files) {
    }
    

    完整方法

        /**
         * 导入
         */
        @RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
        public ResponseObj<Boolean> leadingIn(@RequestParam Map formData,
                                              HttpServletRequest request,
                                              Map<String, InputStream> files) {
            //测试
            try {
                MultipartHttpServletRequest mulRequest = (MultipartHttpServletRequest) request;
                Set<Map.Entry<String, MultipartFile>> set = mulRequest.getFileMap().entrySet();
                Map<String, InputStream> listFile = new LinkedHashMap<>();
                System.out.println("个数" + set.size());
                for (Map.Entry<String, MultipartFile> each : set) {
                    String fileName = each.getKey();
                    MultipartFile file = each.getValue();
                    //这里需要上传FTP
                    try {
                        listFile.put(fileName, file.getInputStream());
                    } catch (Exception ex) {
                        return new ResponseObj<>(false, null);
                    }
                }
    
                String formjson = mulRequest.getParameter("content");
                ObjectMapper mapper = new ObjectMapper();
                mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
                mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    
    //            boolean result = iInstallWorkOrder.upLoadFile(listFile);
                boolean result = true;
    
                return new ResponseObj<>(result, null);
            } catch (Exception ex) {
                System.out.println(ex.toString());
                return new ResponseObj<>(false, null);
            }
    
        }
    

    相关文章

      网友评论

        本文标题:POST/GET请求中RequestBody和RequestPa

        本文链接:https://www.haomeiwen.com/subject/tyiswxtx.html