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://www.mzph.cn/news/681209.shtml

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

相关文章

【复现】Supabase后端服务 SQL注入漏洞_48

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Supabase是什么 Supabase将自己定位为Firebase的开源替代品&#xff0c;提供了一套工具来帮助开发者构建web或移动应用程序。 Sup…

441. Arranging Coins( 排列硬币)

问题描述 你总共有 n 枚硬币&#xff0c;并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯&#xff0c;其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。 给你一个数字 n &#xff0c;计算并返回可形成 完整阶梯行 的总行数。 问题分析 等差数列求和问…

【c++基础】国王的魔镜

说明 国王有一个魔镜&#xff0c;可以把任何接触镜面的东西变成原来的两倍——只是&#xff0c;因为是镜子嘛&#xff0c;增加的那部分是反的。 比如一条项链&#xff0c;我们用AB来表示&#xff0c;不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话&#xff0c;魔镜会把…

LeetCode、1268. 搜索推荐系统【中等,前缀树+优先队列、排序+前缀匹配】

文章目录 前言LeetCode、1268. 搜索推荐系统【中等&#xff0c;前缀树优先队列、排序前缀匹配】题目类型及分类思路API调用&#xff08;排序前缀匹配&#xff09;前缀树优先队列 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创…

车载诊断协议DoIP系列 —— DoIP应用(Application)需求

车载诊断协议DoIP系列 —— DoIP应用(Application)需求 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一…

基于python深度学习的中文情感分析的系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【Chrono Engine学习总结】4-vehicle-4.2-车辆轨迹跟踪

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 0、Vehicle的driver driver在上一篇总结中有过介绍&#xff0c;【Chrono Engine学习总结】4-vehicle-4.1-vehicle的基本概念&#xff0c;这里进一步介绍。 对于一个…

部分意图分类【LLM+RAG】

在生成人工智能领域工作最有价值的事情之一就是发现新兴技术如何融入新的解决方案。 举个例子&#xff1a;在为北美顶级金融服务公司之一设计对话式人工智能助手时&#xff0c;WillowTree 的数据和人工智能研究团队 (DART) 发现&#xff0c;将意图分类与大型语言模型 (LLM) 结合…

推荐高端资源素材图库下载平台整站源码

推荐高端图库素材下载站的响应式模板和完整的整站源码&#xff0c;适用于娱乐网资源网。该模板支持移动端&#xff0c;并集成了支付宝接口。 演示地 址 &#xff1a; runruncode.com/tupiao/19692.html 页面设计精美&#xff0c;不亚于大型网站的美工水准&#xff0c;并且用户…

【STL】vector模拟实现

vector模拟实现 一、vector函数接口总览二、vector当中的成员介绍三、list模拟实现1、默认成员函数&#xff08;1&#xff09;构造函数1&#xff08;2&#xff09;构造函数2&#xff08;3&#xff09;构造函数3 2、拷贝构造函数&#xff08;1&#xff09;写法一&#xff1a;老式…

键盘重映射禁用 CtrlAltDel 键的利弊

目录 前言 一、Scancode Map 的规范 二、禁用 CtrlAltDel 的方法及其缺陷 三、编程实现和测试 3.1 C 实现的简易修改工具 3.2 C# 实现的窗口工具 四、总结 本文属于原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_59075481/article/details…

龙芯开启ssh服务——使用Putty连接

本文采用龙芯3A6000处理器&#xff0c;Loongnix操作系统。 为了能使用其他电脑远程操控龙芯电脑&#xff0c;需要打开loongnix的ssh服务&#xff0c;并在其他电脑里使用putty连接loongnix。 1 修改ssh配置文件 命令行输入&#xff1a; sudo vim /etc/ssh/sshd_config按下i插…

Linux-进程信号

Linux进程信号 初步认识信号信号的存储结构信号的处理方式信号的产生硬件异常产生的信号核心转储sigset_t信号集信号集的操作函数对block表的操作对pending表的操作对handler表的操作信号的捕捉用户态和内核态 信号的处理过程可重入函数volatile关键字 初步认识信号 生活中有哪…

LeetCode、136. 只出现一次的数字【简单,位运算】

文章目录 前言LeetCode、136. 只出现一次的数字【简单&#xff0c;位运算】题目链接与分类思路异或一遍运算 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术…

冲击可以通过峭度指标来检测,是如何来检测的,python示例代码

问题 冲击可以通过峭度指标来检测&#xff0c;是如何来检测的&#xff0c;可以给1个示例代码吗 思路 带冲击的信号其峭度指标>3不带冲击的信号其峭度指标在3左右可以通过滑动窗来检测在哪一段 示例代码 带冲击的信号峭度指标值 import numpy as np import matplotlib.…

2024.02.12

使用STM32Cubemx创建一个工程并且给出每一步的含 选择芯片创建工程 开启调试功能 配置时钟 配置时间树 工程管理 配置仿真器

幻兽帕鲁服务器原来的存档不想玩了,怎么清档?如何重来?

如果需要备份原存档的话&#xff0c;就先把存档导出来备份。或者手动去服务器文件里找到游戏存档文件夹&#xff0c;保存下载。 如无需备份原存档&#xff0c;则可以直接使用幻兽帕鲁应用模板&#xff0c;来重装服务器的操作系统。 方法很简单&#xff1a; 详细教程地…

odoo封装字段widget中无感知刷新数据

常规操作是直接刷新页面 window.location.reload(); 深入源码&#xff0c;发现页面controller层有reload 对应tree的字段widget this.__owl__.parent.parentWidget.__parentedParent.reload(); 对应form的字段widget this.__parentedParent.__parentedParent.reload()

APP inventor零基础移动应用开发

1.Android平台简介 Android由谷歌和开放手机联盟共同创建的一款针对手机的开源软件工具包 主要特色 ---开放性 – 丰富的硬件选择 – 开发商不受任何限制 – 无缝集成互联网服务 App Inventor是由Google公司开发的一款在线开放的Android编程工具软件&#xff0c;通过图形化…

huggingface学习|用dreambooth和lora对stable diffusion模型进行微调

目录 用dreambooth对stable-diffusion-v1-5模型进行微调&#xff08;一&#xff09;模型下载和环境配置&#xff08;二&#xff09;数据集准备&#xff08;三&#xff09;模型微调&#xff08;四&#xff09;运行微调后的模型 用lora对stable-diffusion-v1-5模型进行微调&#…