一文详解RESTful风格API设计

RESTful风格是一种基于HTTP协议设计Web API的软件架构风格,由Roy
Fielding在2000年提出。它强调使用HTTP动词来表示对资源的操作(GET、POST、PUT、PATCH、DELETE等),并通过URI表示资源的唯一标识符。

一、RESTful API的设计原则

RESTful API的设计遵循以下几个原则:

  1. 基于资源:将数据和功能抽象成资源,并通过URI来唯一标识资源。例如,一个用户资源可以通过URL“/users/{id}”来访问,其中“{id}”表示该用户的唯一标识符。
  2. 使用HTTP动词:使用HTTP动词来表示对资源的操作,如GET(获取资源)、POST(创建资源)、PUT(更新资源)和DELETE(删除资源)等。
  3. 无状态:每个请求都包含足够的信息来完成请求,服务器不需要保存任何上下文信息。
  4. 统一接口:使用统一的接口来简化客户端与服务器之间的交互,包括资源标识符、资源操作和响应消息的格式。
  5. 可缓存性:客户端可以缓存响应,以提高性能和减少网络流量。
  6. 分层系统:将系统分为多个层次,每个层次处理特定的功能。

RESTful风格的API设计具有良好的可读性、易用性和可扩展性,广泛应用于Web应用程序和移动应用程序的API设计中。

二、使用到的注解

(1)@RequestMapping
  • 类型 方法注解

  • 位置 SpringMVC控制器方法定义上方

  • 作用 设置当前控制器方法请求访问路径

  • 范例

        @RequestMapping(value = "/users", method = RequestMethod.GET)
        @ResponseBody
        public String save()
        {
            System.out.println("save user");
            return " '{'module': 'user save' }' ";
        }
    
  • 属性

    1. value 请求访问路径
    2. method http请求动作,标准动作(GET、POST、PUT、DELETE)
(2)@PathVariable
  • 类型 形参注解

  • 位置 SpringMVC控制器方法形参定义前面

  • 作用 绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应

  • 范例

        @RequestMapping(value = "users/{id}", method = RequestMethod.DELETE)
        @ResponseBody
        public String delete(@PathVariable Integer id) // PathVariable 路径参数 id对应路径中的id
        {
            System.out.println("delete user");
            return "'{'module': 'user delete'}'";
        }
    
(3)@RestControll
  • 类型 类注解

  • 位置 基于SpringMVC的RESTful开发控制器类定义上方

  • 作用 设置当前控制器类为RESTful风格,等同于 @Controller 与 @ResponseBody两个注解的组合功能

  • 范例

    @RestController
    public class UserController
    {
        @RequestMapping(value = "/users",method = RequestMethod.GET)
        public String save()
        {
            System.out.println("save user");
            return " '{'module': 'user save' }' ";
        }
    
(4)@GetMapping @PostMapping @PutMapping @DeleteMapping
  • 类型 方法注解

  • 位置 基于SpringMVC的RESTful开发控制器方法定义上方

  • 作用 设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作

  • 范例

    @RestController
    @RequestMapping("/users") // 下面的每个控制器方法的请求路径都有前缀 /users
    public class UserController
    {
        @GetMapping("/{id}")
        public String getById(@PathVariable Integer id)
        {
            return "getById";
        }
    }
    
(5)@RequestBody @RequestParam @PathVariable
  1. 区别
    • RequestParam 用于接收URL地址传参或表单传参
    • RequestBody 用于接收JSON数据
    • PathVariable 用于接收路径参数,使用 {参数名} 描述路径参数
  2. 应用
    • 后期开发中,发送请求参数超过1个时,以JSON格式为主,所以@RequestBody应用较广泛
    • 如果发送非JSON格式数据,选用 @RequestParam 接收请求参数
    • 当参数数量只有一个时,或为数字时,可以采用 @PathVariable接收请求路径变量,通常传递id值

三、综合案例

这里提供一个简单的Java示例,用于实现一个基本的RESTful API。假设我们正在开发一个学生管理系统,需要使用RESTful API来实现对学生资源的增删改查操作。

首先,我们需要定义一个表示学生信息的Java类:

public class Student {
    private int id;
    private String name;
    private int age;

    public Student() { }

    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    // Getters and setters
}

然后,我们需要创建一个控制器类来处理客户端请求:

@RestController
@RequestMapping("/students")
public class StudentController {

    // Mock data - replace with database queries later
    private static List<Student> students = new ArrayList<>(Arrays.asList(
            new Student(1, "Alice", 20),
            new Student(2, "Bob", 21),
            new Student(3, "Charlie", 22)
    ));

    // GET /students - get all students
    @GetMapping("")
    public List<Student> getAllStudents() {
        return students;
    }

    // GET /students/{id} - get a student by id
    @GetMapping("/{id}")
    public Student getStudentById(@PathVariable int id) {
        for (Student s : students) {
            if (s.getId() == id) {
                return s;
            }
        }
        return null;  // Return null if student not found
    }

    // POST /students - create a new student
    @PostMapping("")
    public ResponseEntity<String> createStudent(@RequestBody Student student) {
        students.add(student);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    // PUT /students/{id} - update an existing student
    @PutMapping("/{id}")
    public ResponseEntity<String> updateStudent(@PathVariable int id, @RequestBody Student updatedStudent) {
        for (int i = 0; i < students.size(); i++) {
            if (students.get(i).getId() == id) {
                students.set(i, updatedStudent);
                return ResponseEntity.status(HttpStatus.OK).build();
            }
        }
        return ResponseEntity.status(HttpStatus.NOT_FOUND).build();  // Return 404 if student not found
    }

    // DELETE /students/{id} - delete a student by id
    @DeleteMapping("/{id}")
    public ResponseEntity<String> deleteStudentById(@PathVariable int id) {
        for (int i = 0; i < students.size(); i++) {
            if (students.get(i).getId() == id) {
                students.remove(i);
                return ResponseEntity.status(HttpStatus.OK).build();
            }
        }
        return ResponseEntity.status(HttpStatus.NOT_FOUND).build();  // Return 404 if student not found
    }
}

这个控制器类中定义了四个HTTP方法,分别处理对学生资源的不同操作。我们使用Spring Boot框架和Spring MVC模块来实现RESTful API,并使用注解来定义路由和请求处理逻辑。

最后,我们需要在应用程序的入口点(如Spring Boot的main方法)中启动应用程序:

@SpringBootApplication
public class StudentManagementSystemApplication {

    public static void main(String[] args) {
        SpringApplication.run(StudentManagementSystemApplication.class, args);
    }
}

这样,我们就创建了一个简单的RESTful API,可以通过发送HTTP请求来执行学生管理系统的基本操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JPC客栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值