惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

O
OpenAI News
GbyAI
GbyAI
人人都是产品经理
人人都是产品经理
Last Week in AI
Last Week in AI
F
Fortinet All Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
罗磊的独立博客
爱范儿
爱范儿
B
Blog
C
Check Point Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园_首页
A
About on SuperTechFans
Engineering at Meta
Engineering at Meta
V
Visual Studio Blog
P
Proofpoint News Feed
小众软件
小众软件
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
Google Developers Blog
Y
Y Combinator Blog
Recorded Future
Recorded Future
博客园 - 聂微东
WordPress大学
WordPress大学
博客园 - 【当耐特】
腾讯CDC
T
Tailwind CSS Blog
The Register - Security
The Register - Security
V
V2EX
S
SegmentFault 最新的问题
IT之家
IT之家
D
Docker
I
InfoQ
大猫的无限游戏
大猫的无限游戏
云风的 BLOG
云风的 BLOG
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
Stack Overflow Blog
Stack Overflow Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Jina AI
Jina AI
The Cloudflare Blog
量子位
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
博客园 - 叶小钗
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
美团技术团队
B
Blog RSS Feed

微风静语

用 codebase-memory-mcp 给 AI 编程加一层“代码记忆” EchoCraft - 专为独立开发者和小型团队打造的产品官网主题 Halo 站长必备:外链安全与流量分析神器——“链接工具箱”重磅升级! Halo插件开发:java17旧项目迁移至java21项目记录 Halo插件|一个面向创作者的多功能媒体处理工具集 分布式事务详解:从入门到精通 让你的网站初步适配PWA Halo主题 - 微浸:以轻量构建美学,用细节定义体验 深入理解Python爬虫技术:原理、实现与实践 Halo-2.20 新特性:自定义登录页面模版 vue3 中父子组件数据传输踩坑 将你的服务运维面板从宝塔替换为1panel Python实战项目:外星人入侵(源码分享) theme-hao主题适配友链自助提交插件 plugin-artalk 插件保姆级使用教程 plugin-blog-hao 插件部分功能演示 halo 插件开发踩坑记录(一) Thymeleaf 模版引擎语法浅记 信息洪流中的自我救赎 mac 系统里如何管理多个jdk版本 memso API 不完全指南 基础语法:从CPU角度看变量、数组、类型、运算、跳转、函数等语法 halo-theme-hao主题:artalk评论区美化 衡量个人成长 halo-theme-hao 主题魔改教程 分享一个魔改的 Artalk 评论系统邮件模版 halo-theme-hao 主题标签记录 开发一个 Halo2.0 的安全条跳转中台插件! Mac 软件推荐:使用 Mac 一年半来,我一直在用的软件! TypeScript教程---面向对象编程 软件版本命名规范 TypeScript教程---基础语法及编译设置 2024年家乡春季的第一场大雪 提问的智慧 基础篇:容器化部署技术 -—docker,从此摆脱多环境配置的苦恼! 普通本科的四年大学教育,给我带来了什么? 因果与平衡 程序的本质:代码是如何被执行的 软件开发者应该具备的基本提问素质 探索力 Springboot入门基础篇 springboot中如何使用注解来实现aop Springboot项目生成接口文档方法 Java 实体代码生成器 lombok 的使用 深入 Java 泛型 分布式版本控制工具 git 的基本使用 如何搭建前后端分离的项目 初识Vue3--令人焕然一新的使用逻辑和代码组织方式! 浅谈前端发展史 为什么要学习数据结构和算法 关于富文本编辑器 wangeditor 在 vue2 项目中的使用
如何编写 Restful 风格的接口
webjing · 2023-03-12 · via 微风静语

Restful 风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

在Restful风格中,用同一个请求接口(URL)而用不同的请求方式,这就避免了编写多个不同的URL,通过请求的方式也更容易区分出每个方法的功能。

客户端使用GET、POST、PUT、DELETE 4个表示操作方式的动词对服务端资源进行操作:

  • GET用来获取资源,
  • POST用来新建资源(也可以用于更新资源),
  • PUT用来更新资源,
  • DELETE用来删除资源

二、RESTful 风格接口注意事项:

2.1、RESTful接口URL命名原则

  • 命名原则1:HTTP方法后跟的URL必须是名词且统一成名词复数形式
  • 命名原则2:URL中不采用大小写混合的驼峰命名,尽量采用全小写单词,如果需要连接多个单词,则采用〞-”连接
  • 示例:/users、 /users-fans;反例:/getUsers、 /getUsersFans

2.2、RESTful接口URL分级原则

  • 分级原则1:一级用来定位资源分类,如/users即表示需要定位到用户相关资源
  • 分级原则2:二级仍用来定位具体某个资源,如/users/20即表示id为20的用户,再如/users/20/fans/1即表示id为20的用户的id为1的粉丝
  • 一条小建议:原则是为了让我们的开发更加规范,但是不能成为束缚我们开发的枷锁!

2.3、复杂 get 请求接口命名示例:

三、接口的编写

3.1、get 方式的请求参数详解:

参数拼接与路径中

  • 后端接口
@GetMapping("/hello/{name}")
public String hello(@PathVariable("name") String name) {
    return "获取到的name是:" + name;
}
  • 请求地址
localhost:8080/hello/tom

以键值对形式拼接于路径中

  • 后端接口
@GetMapping("/hello")
public String hello(String name) {
    return "获取到的name是:" + name;
}
  • 请求路径
localhost:8080/hello?name=tom

注意:多个参数之间使用 & 连接

自定义参数名称:

用于拼接在路径后边的参数名称和接收名称不一致的时候使用

  • 后端接口
@GetMapping("/hello")
public String hello(@RequestParam("namename") String name) {
    return "获取到的name是:" + name;
}
  • 请求路径
localhost:8080/hello?namename=tom

可缺省参数

  • 后端接口
@GetMapping("/hello")
public String hello(@RequestParam(required = false) String name) {
    return "获取到的name是:" + name;
}

默认值参数

  • 后端接口
@GetMapping("/hello")
public String hello(@RequestParam(defaultValue = "unnamed") String name) {
    return "获取到的name是:" + name;
}

  • 请求地址
localhost:8080/hello

使用 map 接收参数

  • 后端接口
@GetMapping("/hello")
public String hello(@RequestParam Map<String, Object> params) {
    return "name:" + params.get("name") + ",age:" + params.get("age");
}
  • 请求地址
localhost:8080/hello?name=tom&age=18

使用对象接收参数

  • 后端接口
@GetMapping("/hello")
public String hello(User user) {
    return "name:" + user.getName() + ",age:" + user.getAge();
}
  • 请求地址
localhost:8080/hello?name=tom&age=jerry

其中,name 和 age 是实体对应的属性,必须要保证其一致性,才能接收到参数。


3.2、post 方式

   //用户注册
    @PostMapping("/reg")
    public R register(@RequestBody User user){
       return  userService.insert(user);
    }

put 方式


//用户更新
@PutMapping
public R<?> modify(@RequestBody User user){
    return userService.update(user);
}

delete 方式

    //删除用户
    @DeleteMapping("/{id}")
    public R<?> remove(@PathVariable Long id){
        return userService.delete(id);
    }