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;
}
}
2.参数跟在 ? 号后面
/**
* GET请求 参数跟在 ? 号后面
*http://127.0.0.1:8080/getUsername?username=springbootget
* */
@GetMapping("/getUsername")
public String getUsername(@RequestParam("username") String username) {
return "获取到的username是:" + username;
}
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;
}
(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;
}
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");
}
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;
}
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();
}
(2.)指定参数前缀
我们可以结合 @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.");
}
(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();
}