56、springboot ------ RESTful服务及RESTful接口设计

★ RESTful服务

RESTful服务是“前后端分离”架构中的主要功能:

后端应用对外暴露RESTful服务,前端应用则通过RESTful服务与后端应用交互。后端应用  RESTful接口   <------------------> 前端

★ 基于JSON的RESTful服务

使用@RestController注解修饰控制器类,或使用@ResponseBody修饰处理方法即可。

@RestController和@Controller的区别就在于@RestController会自动为每个处理方法都添加@ResponseBody注解。

@RequestBody,用于修饰处理方法的参数,用于获取RESTful提交的请求数据。

RESTful有一个约定,主要是对URL有约定比如对于一个操作图书的RESTful接口:GET  /books/{id} - (获取数据) 获取指定id的图书
GET  /books?参数  -(获取数据) 获取符合查询参数的图书
GET  /books        -(获取数据) 获取所有图书
POST /books        -(添加数据) 添加图书
PUT  /books/{id}    -(更新数据) 更新指定ID的图书
DELETE /books/{id}    -(删除数据) 删除指定ID的图书
DELETE /books?参数    -(删除数据) 删除符合指定参数的图书

Restful处理方法的返回值通常都应该使用HttpEntity或ResponseEntity。

   HttpEntity    只能额外地指定响应头,不支持指定响应码。↑ResponseEntity:  可额外指定响应的响应头、响应码(HttpStatus代表)ResponseEntity 继承 HttpEntity    

代码演示

总结:就只是前端用 get 、 post 、 put 、 delete 发起请求,
后端用
@GetMapping(前端获取数据)、PostMapping(前端推送数据)、
PutMapping(前端修改数据)、DeleteMapping(前端删除数据)
接收,就是 RESTful风格了。

基础数据:
在这里插入图片描述

1、Get 请求, 前段根据id查看图书
在这里插入图片描述

2、查看所有图书,前端用get请求
在这里插入图片描述

3、添加图书,前端用 post 请求
在这里插入图片描述

4、根据id更新图书信息,前端用 put 进行请求
在这里插入图片描述

5、根据id删除图书,前端用delete 发起请求
在这里插入图片描述

总结:

如图:三个方法的访问路径都是一样的,不同的只是请求的方式不同,一个是get,一个是put,一个是delete,这就是 restful 风格,项目会自动识别。
在这里插入图片描述

完整代码

Book

@Data
public class Book
{private Integer id;private String name;private double price;private String author;public Book(Integer id, String name, double price, String author){this.id = id;this.name = name;this.price = price;this.author = author;}
}

BookController

package cn.ljh.app.controller;import cn.ljh.app.domain.Book;
import cn.ljh.app.service.BookService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;import java.util.List;/**     GET  /books/{id} - (获取数据) 获取指定id的图书*     GET  /books?参数  -(获取数据) 获取符合查询参数的图书*     GET  /books        -(获取数据) 获取所有图书*     POST /books        -(添加数据) 添加图书*     PUT  /books/{id}    -(更新数据) 更新指定ID的图书*     DELETE /books/{id}    -(删除数据) 删除指定ID的图书*     DELETE /books?参数    -(删除数据) 删除符合指定参数的图书**  Restful处理方法的返回值通常都应该使用HttpEntity或ResponseEntity。**/@RequestMapping("/books")
@RestController
public class BookController
{//有参构造器进行依赖注入private BookService bookService;public BookController(BookService bookService){this.bookService = bookService;}//根据id查看图书@GetMapping("/{id}")public ResponseEntity<Book> viewBookById(@PathVariable Integer id){Book book = bookService.getBookById(id);//参数1:响应数据体  参数2:需要添加的响应头,没有就给个null   参数3:响应码 , OK 代表 200return new ResponseEntity<>(book, null, HttpStatus.OK);}//查看所有图书@GetMapping("")public ResponseEntity<List<Book>> viewBooks(){List<Book> allBooks = bookService.getAllBooks();return new ResponseEntity<>(allBooks, null, HttpStatus.OK);}//添加图书@PostMapping("")public ResponseEntity<Book> addBook(@RequestBody Book book){Book b = bookService.addOrUpdateBook(book);//HttpStatus.CREATED 代表返回的状态码为 201return new ResponseEntity<>(b, null, HttpStatus.CREATED);}//根据id更新图书信息@PutMapping("/{id}")public ResponseEntity<Book> updateBookById(@PathVariable Integer id, @RequestBody Book book){book.setId(id);Book b = bookService.addOrUpdateBook(book);return new ResponseEntity<>(b, null, HttpStatus.OK);}//根据id删除图书@DeleteMapping("/{id}")public ResponseEntity<Book> deleteBookById(@PathVariable Integer id){Book book = bookService.deleteBookById(id);return new ResponseEntity<>(book, null, HttpStatus.OK);}}

BookService

package cn.ljh.app.service;import cn.ljh.app.domain.Book;import java.util.List;public interface BookService
{//根据id查看图书Book getBookById(Integer id);//查看所有图书List<Book> getAllBooks();//添加/修改图书Book addOrUpdateBook(Book book);//根据id删除图书Book deleteBookById(Integer id);}

BookServiceImpl

package cn.ljh.app.service.impl;import cn.ljh.app.domain.Book;
import cn.ljh.app.service.BookService;
import org.springframework.stereotype.Service;import java.util.*;
import java.util.concurrent.ConcurrentHashMap;@Service
public class BookServiceImpl implements BookService
{//创建一个线程安全的map集合存数据,假设为数据库static Map<Integer, Book> bookDB = new ConcurrentHashMap<>();static int nextId = 1;//初始化数据库的数据static{bookDB.put(nextId, new Book(nextId++, "火影忍者", 120, "岸本"));bookDB.put(nextId, new Book(nextId++, "七龙珠", 121, "鸟山明"));}//根据id查看图书@Overridepublic Book getBookById(Integer id){if (id != null){Book book = bookDB.get(id);if (book!=null){return book;}}throw new RuntimeException("根据id查看图书失败!");}//查看所有图书@Overridepublic List<Book> getAllBooks(){//获取map中的所有数据Collection<Book> mapBooks = bookDB.values();//强转List<Book> books = new ArrayList<>(mapBooks);return books;}//添加/修改图书@Overridepublic Book addOrUpdateBook(Book book){if (book.getId() != null){//修改//map的key是唯一的,所以map里面有这个key的话,直接把原来的value覆盖掉bookDB.put(book.getId(),book);return book;}else {//新增//为新增的图书设置idbook.setId(nextId);//book添加完之后,这个id才会自增bookDB.put(nextId++,book);return book;}}//根据id删除图书@Overridepublic Book deleteBookById(Integer id){Book book = bookDB.remove(id);return book;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/103502.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是正向代理和反向代理

一、什么是正向代理 正向代理&#xff08;Forward Proxy&#xff09;是一种代理服务器&#xff0c;它位于客户端和服务端之间&#xff0c;代表客户端向其他服务器发送请求。一般使用的场景就是&#xff0c;当客户端无法直接访问某些资源时&#xff0c;可以通过正向代理来访问。…

【Java 基础篇】Java 异常处理指南:解密异常处理的关键技巧

异常是 Java 编程中不可避免的一部分。无论你是刚刚入门 Java 编程&#xff0c;还是已经有一定经验&#xff0c;了解异常处理都是非常重要的。本篇博客将向你介绍 Java 中异常的基础知识&#xff0c;帮助你理解什么是异常、为什么需要异常处理以及如何在代码中处理异常。 什么…

js中如何判断一个对象是否为空对象?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Object.keys()⭐ 使用 for...in 循环⭐ 使用 JSON.stringify()⭐ 使用 ES6 的 Object.getOwnPropertyNames()⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带…

【AIGC专题】Stable Diffusion 从入门到企业级实战0401

一、概述 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第01节&#xff0c; 利用Stable Diffusion ControlNet Inpaint模型精准控制图像生成。本部分内容&#xff0c;位于整个Stable Diffusion生…

EXCEL 中find,if and,if or

接上一篇sql中find函数的作用&#xff0c;由于工作需求是用帆软做报表&#xff0c;他的一些代码不仅有js&#xff0c;sql中的还有一些excel的相关知识&#xff0c;故作整理。 FIND() excel中的find原理和sql中相似&#xff0c;具体可查看 SQL函数 $FIND_Yangshiwei....的博客…

一文看懂微信小程序新版隐私协议(附带弹窗组件)

一、前言 微信小程序近期又迎来了一次改革–9月15日之后如果小程序涉及调用微信的隐私接口获取用户的信息的&#xff0c;需要用户手动同意协议后才可正常调用接口&#xff0c;否则会返回报错信息。 隐私接口目前常用的有&#xff1a;手机号快捷获取、读取照片、获取用户的头像…

【美团3.18校招真题2】

大厂笔试真题网址&#xff1a;https://codefun2000.com/ 塔子哥刷题网站博客&#xff1a;https://blog.codefun2000.com/ 最多修改两个字符&#xff0c;生成字典序最小的回文串 提交网址&#xff1a;https://codefun2000.com/p/P1089 由于字符串经过修改一定为回文串&#x…

【C++】vector的模拟实现【完整版】

目录 一、vector的默认成员函数 1、vector类的大体结构 2、无参构造函数 3、拷贝构造函数 4、Swap(operator需要用) 5、赋值重载operator 6、析构函数 二、vector的三种遍历方式 1、size和capacity(大小和容量) 2、 operator[]遍历 3、迭代器iterator遍历和范围for 三…

Vue--1.4Vue指令

Vue会根据不同的指令&#xff0c;针对标签实现不同的功能。 指令&#xff1a;带有v-前缀的特殊标签属性 v-前缀"表达式" 1.v-html 作用:动态解析标签innerHTML <!doctype html> <html> <head><meta charset"utf-8"><meta …

2023国赛数学建模B题思路代码 - 多波束测线问题

# 1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播&#xff0c; 在不同界面上产生反射&#xff0c; 利用这一原理&#xff0c;从测量船换能器垂直向海底发射声波信 号&#xff0c;并记录从声波发射到…

Python 递归、迷宫问题、八皇后问题

递归应用场景 各种数学问题&#xff0c;如八皇后问题、汉诺塔、阶乘问题、迷宫问题、球和篮子问题等各种算法中也会使用到递归&#xff0c;比如快排、归并排序、二分查找、分治算法等能够用栈解决的问题递归的优点就是代码比较简洁 迷宫问题&#xff08;Python版&#xff09;…

Docker 的常用命令

0 基本命令 概述 [root192 home]# docker --helpUsage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersOptions:--config string Location of client configfiles (default "/root/.docker")-c, --context string Name of the context…