RestFul的认识

前言

在这里插入图片描述

RESTful 是 Representational State Transfer 的缩写,是一种软件架构风格,用于在网络上构建和整合应用程序。它基于 HTTP 协议,并定义了一组约束和规范,用于规范客户端和服务器之间的通信。

RESTful API 是遵循 REST 架构规范的 API,它允许客户端以标准化的方式与服务器进行交互。RESTful API 通常用于构建 Web 服务,并已被广泛应用于各种领域,包括电子商务、社交媒体、物联网等。

Rest API设计风格原则

1.使用名词而不是动词

  • 不要使用:
    如:
    /getAllUsers get /users get /users/002
    /createNewUser post /users
    /deleteAllUser delete /users/001

2.Get方法和查询参数不应该涉及状态改变

  • 使用PUT, POST 和DELETE 方法 而不是 GET 方法来改变状态,不要使用GET 进行状态改变。

3.使用复数名词

  • 不要混淆名词单数和复数,为了保持简单,只对所有资源使用复数。
    如:
    /cars 而不是 /car
    /users 而不是 /user
    /products 而不是 /product
    /settings 而不是 /setting
    /orders 而不是 /order

4. 使用子资源表达关系

  • 如果一个资源与另外一个资源有关系,使用子资源:
    如:
    GET /cars/711/drivers/ 返回 car 711的所有司机
    GET /cars/711/drivers/4 返回 car 711的4号司机
    GET /users/11/pets 返回 user 11的所有宠物
    GET /users/11/pets/2 返回 user 11的2号宠物

5.使用Http头声明序列化格式

  • 在客户端和服务端,双方都要知道通讯的格式,格式在HTTP-Header中指定
    如:
    Content-Type 定义请求格式
    Accept 定义系列可接受的响应格式

6.为集合提供过滤 排序 选择和分页等功能

  • Filtering过滤:使用唯一的查询参数进行
    GET /cars?color=red 返回红色的cars
    GET /cars?seats<=2 返回小于两座位的cars集合

  • Sorting排序:允许针对多个字段排序
    GET /cars?sort=-manufactorer,+model
    这是返回根据生产者降序和模型升序排列的car集合

  • Field selection
    移动端能够显示其中一些字段,它们其实不需要一个资源的所有字段,给API消费者一个选择字段的能力,这会降低网络流量,提高API可用性。
    GET /cars?fields=manufacturer,model,id,color

  • Paging分页
    使用 limit 和offset.实现分页,缺省limit=20 和offset=0;
    GET /cars?offset=10&limit=5
    为了将总数发给客户端,使用订制的HTTP头: X-Total-Count.
    链接到下一页或上一页可以在HTTP头的link规定,遵循Link规定:
    Link: https://blog.mwaysolutions.com/sample/api/v1/cars?offset=15&limit=5; rel=“next”,https://blog.mwaysolutions.com/sample/api/v1/cars?offset=50&limit=3; rel=“last”,https://blog.mwaysolutions.com/sample/api/v1/cars?offset=0&limit=5; rel=“first”,https://blog.mwaysolutions.com/sample/api/v1/cars?offset=5&limit=5; rel=“prev”,

7.版本化你的API 支付宝 v1 v2 v3

  • 使得API版本变得强制性,不要发布无版本的API,使用简单数字,避免小数点如2.5.
    一般在Url后面使用?v
    /blog/api/v1

8. 使用Http状态码处理错误

  • 如果你的API没有错误处理是很难的,只是返回500和出错堆栈不一定有用
  • Http状态码提供70个出错,我们只要使用10个左右:
    200 – OK – 一切正常
    201 – OK – 新的资源已经成功创建
    204 – OK – 资源已经成功删除
    304 – Not Modified – 客户端使用缓存数据
    400 – Bad Request – 请求无效,需要附加细节解释如 “JSON无效”
    401 – Unauthorized – 请求需要用户验证
    403 – Forbidden – 服务器已经理解了请求,但是拒绝服务或这种请求的访问是不允许的。
    404 – Not found – 没有发现该资源
    422 – Unprocessable Entity – 只有服务器不能处理实体时使用,比如图像不能被格式化,或者重要字段丢失。
    500 – Internal Server Error – API开发者应该避免这种错误。
    使用详细的错误包装错误: 状态码 数据 header头信息
    {
    “errors”: [
    {
    “userMessage”: “Sorry, the requested resource does not exist”,
    “internalMessage”: “No car found in the database”,
    “code”: 34,
    “more info”: “http://dev.mwaysolutions.com/blog/api/v1/errors/12345”
    }
    ]
    }

Rest API案例

没有使用RestFul的规范之前的设计

@Controller
@RequestMapping("user")
public class DemoController {private static final Logger log = LoggerFactory.getLogger(DemoController.class);//查询一个@RequestMapping("findUserById")public String findUserById(Integer id){log.info("查询用户id为:{}",id);//存储到作用域return "showOne";}//查询所有@RequestMapping("findAll")public String findAll(){log.info("查询所有");List<User>  userList =new ArrayList<User>();userList.add(new User(21,"xiaochen",2300,new Date()));//存储到作用域return "showAll";}//保存@RequestMapping("saveUser")public String save(User user){log.info("user: {}",user);return "redirect:/user/findAll";}//修改@RequestMapping("updateUser")public String update(User user){log.info("user: {}",user);return "redirect:/user/findAll";}@RequestMapping("deleteUser")public String delete(User user){log.info("user: {}",user);return "redirect:/user/findAll";}}

这里我们就完全没有按照我们前面所说的RestFul的架构去规范我们的API,下面我们将采用RestFul的设计去规范。

使用了RestFul的设计

@RestController
@RequestMapping("/v1/users") //符合使用复数名词
public class UserController {private static final Logger log = LoggerFactory.getLogger(UserController.class);// ResponeEntity: springmvc 封装一个专用于restful 响应类   这个类在响应时可以提供响应的状态码,同时还可以自定义响应头信息// HttpStatus:   springmvc 封住一个枚举类型类 这个类中都是网络中状态码/*** 查询某个用户详细* @param id* @return*///@RequestMapping(value = "/{id}",method = RequestMethod.GET)@GetMapping("/{id}")  //@RequestMapping:子类注解 使用GETMapping代表只能使用GET方式访问到当前请求//注解: PathVariable:代表在路径中获取请求参数//@ResponseBody //将控制器方法返回值转为jsonpublic ResponseEntity<User> user(@PathVariable("id") Integer id){log.info("本次id: {}",id);User user = null;try {user = new User(id, "小陈", 2300.23, new Date());} catch (Exception e) {e.printStackTrace();return new ResponseEntity<User>(user,HttpStatus.INTERNAL_SERVER_ERROR);}return new ResponseEntity<>(user,HttpStatus.OK);}/*** 用户列表* @return*/@GetMapping//@ResponseBodypublic ResponseEntity<List<User>> users(){ArrayList<User> users = new ArrayList<>();users.add(new User(21,"小王",2300.23,new Date()));users.add(new User(24,"小金豆",3400.23,new Date()));return  new ResponseEntity<>(users,HttpStatus.OK);}/*** 添加用户*/@PostMapping//@ResponseBody  //@ResponseBody 将方法返回值转为json格式数据 并响应请求   @RequestBody: 接收请求json格式数据 将json格式数据转为对象public ResponseEntity<Void> save(@RequestBody  User user){log.info("name:{} salary:{} bir:{}",user.getName(),user.getSalary(),user.getBir());//调用业务方法return new ResponseEntity<>(HttpStatus.NO_CONTENT);//没有内容}/*** 更新用户* @param user*/@PutMapping("/{id}")//@ResponseBodypublic ResponseEntity<Void> update(@PathVariable("id") Integer id,@RequestBody  User user){log.info("id:{} ",id);log.info("name:{} salary:{} bir:{}",user.getName(),user.getSalary(),user.getBir());//调用业务方法return new ResponseEntity<>(HttpStatus.NO_CONTENT);//没有内容}/*** 删除用户信息* @param id*/@DeleteMapping("/{id}")//@ResponseBodypublic ResponseEntity<Void> delete(@PathVariable("id") Integer id){log.info("本次id: {}",id);return new ResponseEntity<>(HttpStatus.NO_CONTENT);//没有内容}/*** 获取这个人所有宠物*/@GetMapping("/{id}/pets")public ResponseEntity<List<Pet>> pets(@PathVariable("id") Integer id){log.info("查询那个人id: {}",id);List<Pet> pets = Arrays.asList(new Pet(21, "小红帽", 23), new Pet(22, "小猪", 22));return new ResponseEntity<>(pets, HttpStatus.OK);}/*** 获取这个人某个宠物*/@GetMapping("/{id}/pets/{pid}")public ResponseEntity<Pet> pet(@PathVariable("id") Integer id,@PathVariable("pid") Integer petId){log.info("查询那个人id: {}",id);Pet pet = new Pet(21, "小红帽", 23);return new ResponseEntity<>(pet, HttpStatus.OK);}}

上述方法就

代码示例的设计特点总结

  1. 使用了 @RestController 注解
    @RestController 注解表示该类是一个 RESTful 控制器,它可以将方法返回值自动转换为 JSON 格式数据并响应请求。

  2. 使用了标准的 HTTP 方法
    @GetMapping:用于处理 GET 请求
    @PostMapping:用于处理 POST 请求
    @PutMapping:用于处理 PUT 请求
    @DeleteMapping:用于处理 DELETE 请求

  3. 使用了 @PathVariable 注解
    @PathVariable 注解用于获取路径中的参数。

  4. 使用了 @RequestBody 注解
    @RequestBody 注解用于接收请求中的 JSON 格式数据并将其转换为对象。

  5. 使用了 ResponseEntity 类
    ResponseEntity 类用于封装响应数据,包括响应状态码和响应体。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Java实现河南软件客服系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、系统展示四、核心代码4.1 查询客户4.2 新增客户跟进情况4.3 查询客户历史4.4 新增服务派单4.5 新增客户服务费 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的河…

JavaScript 遍历文档生成目录结构

JavaScript 遍历文档生成目录结构 要遍历 HTML 文档并生成目录结构&#xff0c;你可以使用 JavaScript 来进行 DOM 操作和遍历。以下是一个简单的示例代码&#xff0c;演示了如何遍历文档中的标题元素&#xff08;例如 <h1>、<h2>、<h3> 等&#xff09;&…

ChatGPT高效提问—prompt常见用法(续篇十二)

ChatGPT高效提问—prompt常见用法&#xff08;续篇十二&#xff09; 1.1 prompt生成器 ​ 假如想让ChatGPT完成一个相对复杂的任务&#xff0c;但是没想好从哪个方面入手&#xff0c;需求不明确&#xff0c;或者对任务涉及的专业知识不够了解&#xff0c;不能写出专业、准确的…

C#使用重载方法实现不同类型数据的计算

目录 一、涉及到的相关知识 1.重载的方法 2.Convert.ToInt32(String)方法 3.判断字符串是否带有小数点 二、实例 1.示例 2.生成成果 一、涉及到的相关知识 1.重载的方法 重载方法就是方法名称相同&#xff0c;但是每个方法中参数的数据类型、个数或顺序不同的方法。如果…

2024年湖南省考报名时间及流程,选岗很重要!

注册时间&#xff1a;2024年2月18日9:00-25日17:00 报名时间&#xff1a;2024年2月19日9:00-25日17:00 网上确认时间&#xff1a;2024年2月28日9:00-3月2日24:00 缴费时间&#xff1a;2024年2月28日9:00-3月2日24:00 打印准考证时间&#xff1a;2024年3月11日9:00-15日17:00 考…

Python 中的互斥锁:保护共享资源的利器

Python 作为一门流行的编程语言&#xff0c;广泛应用于各种领域&#xff0c;特别是在多线程编程中。多线程编程可以让程序同时执行多个任务&#xff0c;但也会引发一些问题&#xff0c;比如多个线程同时访问共享资源可能导致数据错误或不一致。为了解决这个问题&#xff0c;Pyt…

2016-2022年哨兵影像的在线底图

有一个欧洲初创公司对哨兵影像进行了去云处理&#xff0c;制作了一个2016年-2022年的全球哨兵底图。目前底图通过wmts发布&#xff0c;可免费使用&#xff0c;无需搭梯子。 该数据的特点是&#xff1a; 很少的云覆盖&#xff0c;较少的条纹&#xff0c;色彩平衡 底图切片的网…

酷开科技荣获“消费者服务之星”称号后的未来展望

恭喜酷开科技荣获2023年第四季度黑猫平台“消费者服务之星”称号&#xff01;这是对酷开科技长期以来坚持用户至上、用心服务的肯定和认可。作为OTT行业的佼佼者&#xff0c;酷开科技一直秉承着“以用户为中心”的服务理念&#xff0c;不断追求卓越品质&#xff0c;为用户提供更…

Jumpserver教程01:部署jumpserver

Jumpserver教程 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com 转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-02-11 csdn 博客名称&#xff1a;五维空间-影子&#xff0c;欢迎关注 简要说明…

【EAI 019】Eureka: Human-Level Reward Design via Coding LLM

论文标题&#xff1a;Eureka: Human-Level Reward Design via Coding Large Language Models 论文作者&#xff1a;Yecheng Jason Ma, William Liang, Guanzhi Wang, De-An Huang, Osbert Bastani, Dinesh Jayaraman, Yuke Zhu, Linxi Fan, Anima Anandkumar 作者单位&#xff…

视频直播系统架构的设计与实现

视频直播系统作为一种实时性强、用户互动性高的应用&#xff0c;其架构设计至关重要。本文将介绍如何设计和实现一个稳定、高性能的直播系统架构&#xff0c;以提供良好的用户体验和可靠的服务。 1. 系统架构概述 - 介绍视频直播系统的整体架构&#xff0c;包括客户端、服务…

【java】12:封装

面向对象编程三大特征 1.基本介绍 面向对象编程有三大特征&#xff1a;封装、继承和多态。 2.封装介绍 封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起&#xff0c;数据被保护在内部&#xff0c;程序的其它部分只有通过被授权的操作[方法]&am…

MySQL-----DCL基础操作

▶ DCL简介 DCL英文全称是Data ControlLanguage(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 DCL--管理用户 ▶ 查询用户 use mysql; select * from user; ▶ 创建用户 ▶ 语法 create user 用户名主机名 identified by 密码 设置为在任意主机上访问…

数据库管理-第149期 Oracle Vector DB AI-01(20240210)

数据库管理149期 2024-02-10 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xff09;1 机器学习2 向量3 向量嵌入4 向量检索5 向量数据库5 专用向量数据库的问题总结 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xf…

BKP寄存器与RTC实时时钟

BKP寄存器 BKP寄存器简介 BKP&#xff08;Backup Registers&#xff09;备份寄存器 BKP可用于存储用户应用程序数据。当VDD&#xff08;2.03.6V&#xff09;电源被切断&#xff0c;他们仍然由VBAT&#xff08;1.83.6V&#xff09;维持供电。当系统在待机模式下被唤醒&#xf…

烹饪第一个U-Net进行图像分割

今天我们将学习如何准备计算机视觉中最重要的网络之一&#xff1a;U-Net。如果你没有代码和数据集也没关系&#xff0c;可以分别通过下面两个链接进行访问&#xff1a; 代码&#xff1a; https://www.kaggle.com/datasets/mateuszbuda/lgg-mri-segmentation?sourcepost_page--…

知识价值2-什么是IDE?新手用哪个IDE比较好?

IDE是集成开发环境&#xff08;Integrated Development Environment&#xff09;的缩写&#xff0c;是一种软件应用程序&#xff0c;旨在提供集成的工具集&#xff0c;以方便开发人员进行软件开发。IDE通常包括代码编辑器、编译器、调试器和其他工具&#xff0c;以支持软件开发…

使用R语言fifer包进行分层采样

使用R语言fifer包中的stratified()函数用来进行分层采样非常方便&#xff0c;但fifer包已经从CRAN存储库中删除&#xff0c;需要从存档中下载可用的历史版本&#xff0c;下载链接&#xff1a;Index of /src/contrib/Archive/fifer (r-project.org)https://cran.r-project.org/s…

浅谈路由器交换结构

一、路由器技术概述 路由器&#xff08;Router&#xff09;是连接两个或多个网络的硬件设备&#xff0c;在网络间起网关的作用&#xff0c;是读取每一个数据包中的地址然后决定如何传送的专用智能性的网络设备。它能够理解不同的协议&#xff0c;例如某个局域网使用的以太网协议…

【算法】排序详解(快速排序,堆排序,归并排序,插入排序,希尔排序,选择排序,冒泡排序)

目录 排序的概念&#xff1a; 排序算法的实现&#xff1a; 插入排序&#xff1a; 希尔排序&#xff1a; 选择排序&#xff1a; 堆排序&#xff1a; 冒泡排序&#xff1a; 快速排序&#xff1a; 快速排序的基本框架&#xff1a; 1.Hoare法 2. 挖坑法 3.前后指针法 快…