Restful风格API接口开发springMVC篇

 

Restful风格API接口开发springMVC篇 Restful风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
在Restful风格中,用户请求的url使用同一个url而用请求方式:get,post,delete,put...等方式对请求的处理方法进行区分,这样可以在前后台分离式的开发中使得前端开发人员不会对请求的资源地址产生混淆和大量的检查方法名的麻烦,形成一个统一的接口。
在Restful风格中,现有规定如下:
GET(SELECT):从服务器查询,可以在服务器通过请求的参数区分查询的方式。 POST(CREATE):在服务器新建一个资源,调用insert操作。 PUT(UPDATE):在服务器更新资源,调用update操作。 PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。(目前jdk7未实现,tomcat7也不行)。 DELETE(DELETE):从服务器删除资源,调用delete语句。
了解这个风格定义以后,我们举个例子:
如果当前url是 http://localhost:8080/User
那么用户只要请求这样同一个URL就可以实现不同的增删改查操作,例如
http://localhost:8080/User?_method=get&id=1001  这样就可以通过get请求获取到数据库 user 表里面 id=1001 的用户信息
http://localhost:8080/User?_method=post&id=1001&name=zhangsan  这样可以向数据库 user 表里面插入一条记录
http://localhost:8080/User?_method=put&id=1001&name=lisi  这样可以将 user表里面 id=1001 的用户名改为lisi
http://localhost:8080/User?_method=delete&id=1001  这样用于将数据库 user 表里面的id=1001 的信息删除
这样定义的规范我们就可以称之为restful风格的API接口,我们可以通过同一个url来实现各种操作。
接下来我们讲解spring-mvc中是如何实现restful风格API接口的,并且对其中出现的问题进行解决!(java web对 put 和 delete 请求的不支持问题)
首先我们搭建好spring mvc的项目接口,并按照restful风格写好控制器,这里我写了一个User控制器类和一个User "Action" ->

这里的controller 和 action的url地址是按照restful风格编写的 访问地址 /User/User 用method区分请求方法
我们的前台使用的是jquery ajax进行请求->
 
 
 

有人会问了? 为什么delete 和put用的也是post的请求,这里就要说说java里面对put和delete的不支持了->
java里面原本是对put和delete请求进行过滤掉的(不知道为什么要这么做),而且在servlet里面还有doGet,doPost,doDelete,doPut的对应方法,但是不可以使用(尴尬不尴尬),同样spring mvc里面也有对应的method=RequestMethod.PUT 和Delete,但是ajax里面type写成Put、Delete是可以访问到对应的方法的,但是参数却无法传递过去,所有传递过去的参数都是null(郁闷不郁闷)!C#就不会这样,C#的API编程需要开启一下PUT和Delete就可以了,并不需要java里面这么复杂,说到这里我们解决一下这个问题->
首先在springMVC 项目的Web.xml里面增加一个过滤器filter

1 <!-- 浏览器不支持put,delete等method,由该filter将/xxx?_method=delete转换为标准的http delete方法 -->
2     <filter>
3         <filter-name>hiddenHttpMethodFilter</filter-name>
4         <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
5     </filter>
6     <filter-mapping>
7         <filter-name>hiddenHttpMethodFilter</filter-name>
8         <url-pattern>/*</url-pattern>
9     </filter-mapping>

当然有些新手不知道这段代码加在哪里,那么我就将我的web.xml一并粘贴在此处(我也搞这个半天...) 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xmlns="http://java.sun.com/xml/ns/javaee"
 4          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 5          version="3.0">
 6 
 7     <!-- 浏览器不支持put,delete等method,由该filter将/xxx?_method=delete转换为标准的http delete方法 -->
 8     <filter>
 9         <filter-name>hiddenHttpMethodFilter</filter-name>
10         <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
11     </filter>
12     <filter-mapping>
13         <filter-name>hiddenHttpMethodFilter</filter-name>
14         <url-pattern>/*</url-pattern>
15     </filter-mapping>
16 
17     <!--这段代码如果不用上面的的话是可以实现put的-->
18     <!--<filter>
19         <filter-name>HttpMethodPutFilter</filter-name>
20         <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
21     </filter>
22     <filter-mapping>
23         <filter-name>HttpMethodPutFilter</filter-name>
24         <url-pattern>/*</url-pattern>
25     </filter-mapping>-->
26 
27 
28     <welcome-file-list>
29         <welcome-file>/index.jsp</welcome-file>
30     </welcome-file-list>
31     <!-- Spring MVC配置 -->
32     <servlet>
33         <servlet-name>spring</servlet-name>
34         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
35 
36         <!-- load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法) -->
37         <load-on-startup>1</load-on-startup>
38     </servlet>
39 
40     <servlet-mapping>
41         <servlet-name>spring</servlet-name>
42         <url-pattern>/</url-pattern>
43     </servlet-mapping>
44 
45     <!-- Spring配置 -->
46     <listener>
47         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
48     </listener>
49 
50     <!-- 指定Spring Bean的配置文件所在目录。默认配置在WEB-INF目录下 -->
51     <context-param>
52         <param-name>contextConfigLocation</param-name>
53         <param-value>classpath:applicationContext.xml</param-value>
54     </context-param>
55 </web-app>

这里我们将过滤器配置好了,我有一段注释掉了,如果用下面这个配置文件->

1  <!--这段代码如果不用上面的的话是可以实现put的-->
2     <filter>
3         <filter-name>HttpMethodPutFilter</filter-name>
4         <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
5     </filter>
6     <filter-mapping>
7         <filter-name>HttpMethodPutFilter</filter-name>
8         <url-pattern>/*</url-pattern>
9     </filter-mapping>

这个配置项如果写在这里的话是可以支持PUT请求的,但是DELETE请求依然不可以,那么我只能选择第一种方法了

1 <filter>
2         <filter-name>hiddenHttpMethodFilter</filter-name>
3         <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
4     </filter>
5     <filter-mapping>
6         <filter-name>hiddenHttpMethodFilter</filter-name>
7         <url-pattern>/*</url-pattern>
8     </filter-mapping>

这一段的方法是用 org.springframework.web.filter.HiddenHttpMethodFilter 的内置过滤器类进行对http请求的标准化。这样让我们可以自己声明请求的方式。
配置完成这个以后,我们在ajax里面需要传递一个参数_method:"PUT" 和 _method:"DELETE",但是请求方式仍然是POST

 


这样配置的话,我们已经可以实现对DELETE修饰的方法进行访问,同样_method:'PUT'我们可以对PUT修饰的方法进行访问,这样我们上面定义的控制器类已经可以实现了。

自我总结:### 概述
RESTful 是一种基于 HTTP 协议设计的 API 设计风格,它使用 HTTP 方法(GET、POST、PUT、DELETE)来实现资源的创建、读取、更新和删除操作(CRUD)。Spring MVC 是 Spring 框架的一个模块,非常适合用于开发 RESTful 风格的 API 接口。下面将详细介绍如何使用 Spring MVC 开发 RESTful 风格的 API 接口,并给出示例。

开发步骤及示例

1. 创建 Spring Boot 项目

可以使用 Spring Initializr(https://start.spring.io/)创建一个新的 Spring Boot 项目,添加 Spring Web 依赖,该依赖包含了 Spring MVC 的核心功能。

2. 定义实体类

假设我们要开发一个简单的图书管理系统,首先定义一个 Book 实体类:

package com.example.demo.entity;

public class Book {
    private Long id;
    private String title;
    private String author;

    // 无参构造函数
    public Book() {
    }

    // 有参构造函数
    public Book(Long id, String title, String author) {
        this.id = id;
        this.title = title;
        this.author = author;
    }

    // Getter 和 Setter 方法
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}

3. 创建控制器类

使用 @RestController 注解创建一个控制器类,处理客户端的请求。使用不同的 HTTP 方法注解(如 @GetMapping@PostMapping 等)来映射不同的请求:

package com.example.demo.controller;

import com.example.demo.entity.Book;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/books")
public class BookController {
    private List<Book> books = new ArrayList<>();

    // 获取所有图书信息
    @GetMapping
    public List<Book> getAllBooks() {
        return books;
    }

    // 根据 ID 获取图书信息
    @GetMapping("/{id}")
    public Book getBookById(@PathVariable Long id) {
        for (Book book : books) {
            if (book.getId().equals(id)) {
                return book;
            }
        }
        return null;
    }

    // 创建新图书
    @PostMapping
    public Book createBook(@RequestBody Book book) {
        books.add(book);
        return book;
    }

    // 根据 ID 更新图书信息
    @PutMapping("/{id}")
    public Book updateBook(@PathVariable Long id, @RequestBody Book updatedBook) {
        for (int i = 0; i < books.size(); i++) {
            Book book = books.get(i);
            if (book.getId().equals(id)) {
                book.setTitle(updatedBook.getTitle());
                book.setAuthor(updatedBook.getAuthor());
                books.set(i, book);
                return book;
            }
        }
        return null;
    }

    // 根据 ID 删除图书信息
    @DeleteMapping("/{id}")
    public void deleteBook(@PathVariable Long id) {
        books.removeIf(book -> book.getId().equals(id));
    }
}

4. 运行项目并测试

src/main/java 目录下找到包含 main 方法的启动类(通常类名以 Application 结尾),运行该类启动 Spring Boot 应用程序。

可以使用 Postman 或其他 API 测试工具来测试 RESTful API 接口:

  • 获取所有图书信息:发送 GET 请求到 http://localhost:8080/books
  • 根据 ID 获取图书信息:发送 GET 请求到 http://localhost:8080/books/1(假设图书 ID 为 1)。
  • 创建新图书:发送 POST 请求到 http://localhost:8080/books,并在请求体中添加图书信息,例如:
{
    "id": 1,
    "title": "Java 编程思想",
    "author": "Bruce Eckel"
}
  • 根据 ID 更新图书信息:发送 PUT 请求到 http://localhost:8080/books/1,并在请求体中添加更新后的图书信息。
  • 根据 ID 删除图书信息:发送 DELETE 请求到 http://localhost:8080/books/1

总结

使用 Spring MVC 开发 RESTful 风格的 API 接口主要步骤包括定义实体类来表示资源,创建控制器类来处理不同类型的 HTTP 请求,使用合适的注解来映射请求路径和方法,最后通过测试工具验证接口的正确性。Spring MVC 提供了简洁的方式来实现 RESTful API,使得开发过程更加高效和规范。

posted @   皇问天  阅读(39491)  评论(4编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示