同福

SpringBoot实现Restful风格接口的GET、POST、PUT、DELETE请求方式接收参数的方法【20211109】

介绍

介绍

福哥今天把SpringBoot框架实现RESTFul接口的几个请求方式GET、POST、PUT、DELETE的接收参数的方法,SpringBoot处理HTTP请求的query参数和post参数以及raw参数基本用不到Servlet那一套,通过几个内建的注解就全部搞定了~~

Query和Post

在Java里面把Query参数和Post参数给混合到一起了,简单说就是你在Query里面设置了一个id,在Post里面也设置了一个id,通过Java获取id这个参数会得到Post参数。

也就是说,如果只有Query参数,那么获取的就是Query参数,如果Query和Post有同名参数,那么获取的就是Post参数,这个特性迫使我们在设计功能的时候就不能在Query和Post里面设计同名参数不同用途。

@RequestParam

根据Java的这个特性,SpringBoot设计了一个@RequestParam注解,这个注解可以用来获取Query或者Post参数,也是Post优先的规则。

@RequestBody

@RequestBody里面包括了POST的原始数据,但是你缺不能通过它去获取formData数据或者x-www-form-urlencoded数据。

但是你可以通过它去获取RAW数据,然后自己拿去做二次处理,例如:把它当作一个JSON数据进行解析。

GET

首先,我们来一个GET方式,GET方式只有Query参数,获取Query参数比较简单,直接定义方法参数即可,方法参数的名称就是Query的参数名称。

GET方式通@GetMapping来指明。

@GetMapping("/net.tongfu.restful.get")
public Map<String, Object> methodGet(
        String queryParam1,
        Integer queryParam2
){
    Map<String, Object> map = new LinkedHashMap<>();

    map.put("queryParam1", queryParam1);
    map.put("queryParam2", queryParam2);

    return map;
}

home/topic/2021/1108/11/9d296d23c7d1c7ef3b097ac895662ace.png

POST

接着我们再来一个POST方式,前面说过了,Java对Query和Post不敏感,所以我们在处理POST请求的时候要把Query参数和Post参数的名称区分开。

POST方式通@PostMapping来指明。

@PostMapping("/net.tongfu.restful.post")
public Map<String, Object> methodPost(
        String queryParam1,
        Integer queryParam2,
        @RequestParam String postParam1,
        @RequestParam Integer postParam2
        ){
    Map<String, Object> map = new LinkedHashMap<>();

    map.put("queryParam1", queryParam1);
    map.put("queryParam2", queryParam2);
    map.put("postParam1", postParam1);
    map.put("postParam2", postParam2);

    return map;
}

home/topic/2021/1108/11/bad2d893f079a479204ffbba8557617e.png

PUT

再来我们测试PUT方式,PUT方式和POST方式基本是一样的。

PUT方式通@PutMapping来指明。

@PutMapping("/net.tongfu.restful.put")
public Map<String, Object> methodPut(
        String queryParam1,
        Integer queryParam2,
        @RequestParam String postParam1,
        @RequestParam Integer postParam2
){
    Map<String, Object> map = new LinkedHashMap<>();

    map.put("queryParam1", queryParam1);
    map.put("queryParam2", queryParam2);
    map.put("postParam1", postParam1);
    map.put("postParam2", postParam2);

    return map;
}

DELETE

最后我们测试DELETE方式,DELETE方式和GET方式基本是一样的。

DELETE方式通@DeleteMapping来指明。

@DeleteMapping("/net.tongfu.restful.delete")
public Map<String, Object> methodDelete(
        String queryParam1,
        Integer queryParam2
){
    Map<String, Object> map = new LinkedHashMap<>();

    map.put("queryParam1", queryParam1);
    map.put("queryParam2", queryParam2);

    return map;
}

默认Default

默认情况下,如果我们获取一个参数,而这个参数客户端没有提供,就会得到null值。

但是这个null值不是我们期望的,为了避免这种情况,要不强制要求客户端提供,要不就给它一个默认值。

@RequestParam可以在定义的时候通过default设置一个默认值,当客户端没有提供参数的时候就返回这个默认值。

@PostMapping("/net.tongfu.restful.default")
public Map<String, Object> methodDefault(
        String queryParam1,
        Integer queryParam2,
        @RequestParam(defaultValue = "默认") String postParam1
){
    Map<String, Object> map = new LinkedHashMap<>();

    map.put("queryParam1", queryParam1);
    map.put("queryParam2", queryParam2);
    map.put("postParam1", postParam1);

    return map;
}

home/topic/2021/1108/11/18190a117cc7cc3a0d8e9d706c8bf142.png

必选Require

默认情况下,通过@RequestParam指定的参数,如果客户端不提供这个参数的话,会报出400错误。

如果我们不要求客户端必须提供某个参数的话,可以通过@RequestParam的require控制这个参数是否必须提供。

@PostMapping("/net.tongfu.restful.require")
public Map<String, Object> methodRequire(
        String queryParam1,
        Integer queryParam2,
        @RequestParam(required = false) String postParam1
){
    Map<String, Object> map = new LinkedHashMap<>();

    map.put("queryParam1", queryParam1);
    map.put("queryParam2", queryParam2);
    map.put("postParam1", postParam1);

    return map;
}

home/topic/2021/1108/11/cb51ef8bffe4c66f507298dfe6566f93.png

JSON

如果我们需要处理JSON数据,就需要通过@RequestBody去接收RAW数据,然后再去解析这个RAW数据。

@PostMapping("/net.tongfu.restful.json")
public Map<String, Object> methodQueryAndPost(
        String param1,
        Integer param2,
        @RequestBody String jsonString
){
    Map<String, Object> map = new LinkedHashMap<>();
    JSONObject jsonObject;

    jsonObject = JSONObject.fromObject(jsonString);

    map.put("queryParam1", param1);
    map.put("queryParam2", param2);
    map.put("jsonParam1", jsonObject.get("param1").toString());
    map.put("jsonParam2", Integer.valueOf(jsonObject.get("param2").toString()));

    return map;
}

home/topic/2021/1108/11/c70573b1dacdc2fe27a2009910d3394f.png

总结

今天福哥带着童鞋们针对SpringBoot框架的RESTFul风格接口的各种请求方式的参数接收的方法进行了一个系统的学习,在使用SpringBoot开发RESTFul接口的时候,这些技术是必须熟练掌握的~~