springboot Restful风格get请求接口
1.参数直接在路径中

package com.example.demo.controller;
import com.example.demo.model.Phone;
import com.example.demo.model.User;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * 这种 RESTful 风格
 * */
@RestController
public class RestfulGetController {
    /**
     * GET请求 参数直接在路径中
     *http://127.0.0.1:8080/getName/springbootget
     * */
    @GetMapping("/getName/{name}")
    public String getName(@PathVariable("name") String name) {
        return "获取到的name是:" + name;
    }
}

restfull 请求参数规范_User


2.参数跟在 ? 号后面

/**
     * GET请求 参数跟在 ? 号后面
     *http://127.0.0.1:8080/getUsername?username=springbootget
     * */
    @GetMapping("/getUsername")
    public String getUsername(@RequestParam("username") String username) {
        return "获取到的username是:" + username;
    }

restfull 请求参数规范_User_02


3.参数没有传递的情况

(1.).如果没有传递参数 Controller 将会报错,我们可以使用 required = false 标注参数是非必须的。

/**
     * GET请求 ,参数没有传递的情况
     * 如果没有传递参数 Controller 将会报错,我们可以使用 required = false 标注参数是非必须的。
     *http://127.0.0.1:8080/queryName
     *
     * */
    @GetMapping("/queryName")
    public String queryName(@RequestParam(name = "name", required = false) String name) {
        return "获取到的name是:" + name;
    }

restfull 请求参数规范_User_03


(2.)如果没有传递参数 Controller 将会报错,我们可以使用指定个默认值,当没有传递参数时自动使用默认值:。

/**
     * GET请求 ,参数没有传递的情况
     * 如果没有传递参数 Controller 将会报错,我们可以使用 required = false 标注参数是非必须的。
     *http://127.0.0.1:8080/queryUsername
     *
     * */
    @GetMapping("/queryUsername")
    public String queryUsername(@RequestParam(name = "username", defaultValue = "springboot") String username) {
        return "获取到的username是:" + username;
    }

restfull 请求参数规范_spring boot_04


4.使用 map 来接收参数

/**
     * GET请求 ,Controller 还可以直接使用 map 来接收所有的请求参数:
     *
     *http://127.0.0.1:8080/getMap?name=springboot&age=12
     *
     * */
    @GetMapping("/getMap")
    public String getMap(@RequestParam Map<String, Object> params) {
        return "name:" + params.get("name") + "<br>age:" + params.get("age");
    }

restfull 请求参数规范_spring boot_05


5.接收一个数组

/**
     * GET请求 ,Controller 还可以直接使用 接收一个数组:
     *
     *http://127.0.0.1:8080/getArr?name=springboot&name=get
     *
     * */
    @GetMapping("/getArr")
    public String hello(@RequestParam("name") String[] names) {
        String result = "";
        for(String name:names){
            result += name + "<br>";
        }
        return result;
    }

restfull 请求参数规范_spring boot_06


6.使用对象来接收参数

(1)如果一个 get 请求的参数太多,我们构造一个对象来简化参数的接收方式

package com.example.demo.model;


public class User {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
/**
     * GET请求 ,Controller 还可以直接使用 接收一个对象:
     *
     *http://127.0.0.1:8080/getUser?name=springboot&age=100
     * 如果传递的参数有前缀,且前缀与接收实体类的名称相同,那么参数也是可以正常传递的:
     *http://127.0.0.1:8080/getUser?user.name=springboot&user.age=120
     * */
    @GetMapping("/getUser")
    public String getUser(User user) {
        return "name:" + user.getName() + "<br> age:" + user.getAge();
    }

restfull 请求参数规范_spring_07


restfull 请求参数规范_spring_08


(2.)指定参数前缀

restfull 请求参数规范_spring boot_09


我们可以结合 @InitBinder 解决这个问题,通过参数预处理来指定使用的前缀为 u.

/**
     * GET请求 ,Controller 还可以直接使用 接收一个对象:
     *  我们可以结合 @InitBinder 解决这个问题,通过参数预处理来指定使用的前缀为 u.
     *  http://127.0.0.1:8080/getU?u.name=springboot&u.age=120
     * */
    @GetMapping("/getU")
    public String getU(@ModelAttribute("u") User user) {
        return "name:" + user.getName() + "<br> age:" + user.getAge();
    }

    @InitBinder("u")
    private void initBinder(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("u.");
    }

restfull 请求参数规范_spring_10


(3.)构造多个对象来接收参数

如果一个 get 请求的参数分属不同的对象,也可以使用多个对象来接收参数:

package com.example.demo.model;

public class Phone {
    private String number;

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
}
/**
     * GET请求 ,
     *  get 请求的参数分属不同的对象,也可以使用多个对象来接收参数
     *  http://127.0.0.1:8080/getUserPhone?name=springboot&age=120&number=13456621265
     * */
    @GetMapping("/getUserPhone")
    public String getUserPhone(User user, Phone phone) {
        return "name:" + user.getName() + "<br> age:" + user.getAge()
                + "<br> number:" + phone.getNumber();
    }

restfull 请求参数规范_restfull 请求参数规范_11