目录
一、背景
二、配置端口和路径
三、实现接口请求
3.1 整个类的注解
3.2 设置请求必传参数&参数的默认值
四、restful风格接口 注解
五、接口的传参与返回值为json格式
5.1 url传参为对象,直接传类的属性值,key =value 格式
5.2 url传参为json
5.3 设置请求方式get/post
5.4 返回值为一个对象
六、封装接口返回值
一、背景
常见的接口,如get请求,参数直接在url里传输:
http://127.0.0.1:8080/boot/show?age=18&name=zhangsan
像post请求,传参与返回值都是json格式的数据。那这个spring boot是如何实现的呢?
二、配置端口和路径
在resource文件夹中,application.yml 配置项目的端口号和路由。
application.yml
server:
port: 8080
servlet:
context-path: /boot
我们该项目的端口为8080,路径为/boot
整个项目的请求路径就是http://host:8080/boot/xxxxxx
三、实现接口请求
3.1 整个类的注解
创建Controller类。使用注解@RestController
@RestController 作用等于 @Controller + @ResponseBody
当我们整个类不使用@RestController时,需要使用@Controller 与 @ResponseBody这两个注解。
@ResponseBody注解的作用是将我们的返回值转成json格式。
@RequestMapping("/test")注解,设置我们整个类的路径为/test
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class HiController {
@RequestMapping("/hi")
public String sayHi(){
return "hi success";
}
}
如方法sayHi的请求(public String sayHi()),路径为/hi,整体路径就是
接口返回值为 hi success
3.2 设置请求必传参数&参数的默认值
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class HiController {
@RequestMapping("/hi")
public String sayHi(){
return "hi success";
}
@RequestMapping("/hello")
public String sayHello(@RequestParam(required = true,defaultValue = "张三") String name){
return "hello"+name;
}
}
设置hello请求,name参数为必填项目。name不传会直接报错
@RequestParam(required = true)
这里还可以给name参数设置默认值,当name不传时,默认为 张三
@RequestParam(defaultValue = "张三")
具体请求:
http://127.0.0.1:8080/boot/test/hello?name=李四
返回值为 hello李四
传参格式为?后面key=value格式
四、restful风格接口 注解
使用@PathVariable注解
@RequestMapping("/hi5/{sid}")
public String hi5(@PathVariable("sid") int id){
String name = null;
switch (id){
case 1:
name="zs";
break;
case 2:
name="lisi";
break;
default:
name="dashu";
break;
}
return "hi,"+name;
}
@RequestMapping("/hi6/{id}")
public String hi6(@PathVariable int id){
String name = null;
switch (id){
case 1:
name="zs";
break;
case 2:
name="lisi";
break;
default:
name="dashu";
break;
}
return "hi,"+name;
}
对应的请求
http://127.0.0.1:8080/boot/hi5/1
http://127.0.0.1:8080/boot/hi5/2
注意:
这里的名称要保持一致,如果不想保持一致的话,可以使用@PathVariable("sid") 给id 设置一个别名。
这里设置id的别名为sid,保证这两处的名称一致就可以了。
五、接口的传参与返回值为json格式
接口的传参与返回值为json格式,是将一个对象转成了json格式。
传参数与返回值的本质各自是一个对象。
定义一个Student类。
import lombok.Data;
@Data
public class Student {
private String name;
private int age;
}
设置一个接口的请求参数为Student类
@RequestMapping("/show")
public String show(Student student){
return student.toString();
}
5.1 url传参为对象,直接传类的属性值,key =value 格式
不传参数,直接请求
http://127.0.0.1:8080/boot/show
传参数
http://127.0.0.1:8080/boot/show?age=18&name=zhangsan
我们直接在url的请求里,直接输入了student类的属性值,spring boot 成功识别了 Student这个类。
5.2 url传参为json
上面的Person类,我们要求url传Person类时,要求传参数为Json格式。
使用@RequestBody
@RequestMapping("/show1")
public String show1(@RequestBody Student student){
return student.toString();
}
在postman中,设置传参为json格式
5.3 设置请求方式get/post
接着第三节Person类讲,我们设置请求的方式。
如设置请求为post请求。method = RequestMethod.POST
@RequestMapping(value = "/show1",method = RequestMethod.POST)
public String show1(@RequestBody Student student){
return student.toString();
}
在postman中,进行post请求
5.4 返回值为一个对象
当接口请求的返回值,为一个对象时。
@RequestMapping(value = "/show2",method = RequestMethod.POST)
public Student show2(@RequestBody Student student){
return student;
}
使用postman进行请求,发现接口返回值也是一个json。
这是因为我们整个类的注解
@RestController = @Controller + @ResponseBody
返回值为json,是这个@ResponseBody注解的作用。
当我们整个类不使用@RestController时,需要使用@Controller 与 @ResponseBody这两个注解。
本节源码
package com.example.com_chenshuai.Controller;
import com.example.com_chenshuai.entity.Student;
import org.springframework.web.bind.annotation.*;
@RestController
public class HiController {
@RequestMapping("/hi")
public String hi(){
return "hi";
}
@RequestMapping("/hi1")
public String hi1(@RequestParam(required = true,defaultValue = "张三") String name){
return "hi"+name;
}
@RequestMapping("/hi5/{sid}")
public String hi5(@PathVariable("sid") int id){
String name = null;
switch (id){
case 1:
name="zs";
break;
case 2:
name="lisi";
break;
default:
name="dashu";
break;
}
return "hi,"+name;
}
@RequestMapping("/hi6/{id}")
public String hi6(@PathVariable int id){
String name = null;
switch (id){
case 1:
name="zs";
break;
case 2:
name="lisi";
break;
default:
name="dashu";
break;
}
return "hi,"+name;
}
@RequestMapping("/show")
public String show(Student student){
return student.toString();
}
@RequestMapping(value = "/show1",method = RequestMethod.POST)
public String show1(@RequestBody Student student){
return student.toString();
}
@RequestMapping(value = "/show2",method = RequestMethod.POST)
public Student show2(@RequestBody Student student){
return student;
}
}
六、封装接口返回值
我们定义ResultMsg类,来封装接口返回值。
ResultMsg类
package com.example.com_chenshuai.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResultMsg<T> {
public static final String SUCCESS_CODE = "200";
public static final String SUCCESS_STATUS = "success";
private String no;
private String msg;
private T data;
public ResultMsg(String no, String msg) {
this.no = no;
this.msg = msg;
}
public static <T> ResultMsg<T> success(T data){
return new ResultMsg<>(SUCCESS_CODE,SUCCESS_STATUS,data);
}
public static <T> ResultMsg<T> error(String no,String msg){
return new ResultMsg<>(no,msg);
}
}
这里使用泛型。
我们定义一个Student类,单纯是为了举例子。
Student类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private String no;
private String name;
}
Controller请求,及返回值的封装。(StudentController )
package com.example.com_chenshuai.Controller;
import com.example.com_chenshuai.entity.ResultMsg;
import com.example.com_chenshuai.entity.Student;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/student")
@RestController
public class StudentController {
@RequestMapping(value = "/add",method = RequestMethod.POST)
public ResultMsg<Student> addStudent(@RequestBody Student student){
boolean b = true;
if (b){
return ResultMsg.success(student);
} else {
return ResultMsg.error("100","增加失败");
}
}
}
启动项目后,使用postman进行请求