带着问题,找答案:

通过本片文章,你会了解以下四点。并且我会给出go语言的实现案例。

1、了解restful风格的来源、起源、演变史

2、了解restful风格的定义、含义

3、掌握restful风格的简单运用

4、做一个小demo

在restful中前进,是一个非常有趣的过程。

一、他打哪来?为解决什么而去?

1、他爹是谁?

是个叫Roy Fielding的博士,是曾经参与开发http协议(现在上网的基础规则)的主力之一。

2、为啥发明?

2000年那会,网上资源凌乱不堪。传递信息时。前后端交互时,乱操作http (如:用GET、POST乱传参数)。大佬不愧是大佬,roy fielding博士,敏锐的发现这一点。并在自己的论文中书写出了一种规则(风格)。试图平息这场混乱。(“让网络资源,能像图书馆中的书记一样管理”)

目标是:让Web服务 简单可扩展(加服务器就能扛更多人访问)、无状态(服务器不记仇,每次请求独立)

二、restful的具体表现?

1、一切皆“资源”

互联网上的(用户、订单、图片...),每个资源都有一个唯一地址(URL),
比如: http://api.com/users (代表所有用户)

2、用HTTP动词操作资源

动作HTTP动词例子作用
GETGET /users/101获取101号用户信息
POSTPOST /users创建新用户
改(全量)PUTPUT /users/101更新101号全部信息
DELETEDELETE /users/101删除101号用户
改(局部)PATCHPATCH /users/101只改用户昵称

3、返回必带状态码

  • 200 ok:成功
  • 201 Created:创建成功
  • 404 Not Found:资源不存在

....

三、Restful的意义!

1、结束的时代,从前url随意设定。如:/getUser?id=1、/delete_order?oid=2...
     现在通过URL+HTTP动词,让全天下的程序员都能看懂。

2、只要按照这一套标准、这同一种风格。无论是go还是C、C++、Java等其他语言。都能通过接口调用,流畅的配合实现某种功能。

3、幂等安全:幂-就是多次。同一操作,连续执行多次,效果是一样的。如delete一个条数据多次,效果与仅delete一次,是相同的。

在进行实战演练前,你需要掌握(go基础知识、http相关知识、数据库相关知识)

四、实战演练

跟着本博主的思路,一点一点来,包教会。

第一步:通过一个及其简单的代码入门。

1、入门版:

目标:掌握·通过http动词变换进行不同的操作

package mainimport ("encoding/json""net/http"
)// 用户结构体
type User struct {ID   int    `json:"id"`Name string `json:"name"`
}// 内存存储(代替数据库)
var users = []User{{ID: 1, Name: "张三"},{ID: 2, Name: "李四"},
}func main() {// 注册路由:处理 /users 的所有请求http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {// 设置响应头(告诉客户端返回的是JSON)w.Header().Set("Content-Type", "application/json")switch r.Method {case "GET": // 获取用户列表json.NewEncoder(w).Encode(users)case "POST": // 创建新用户var newUser User// 解析客户端发来的JSON数据if err := json.NewDecoder(r.Body).Decode(&newUser); err != nil {w.WriteHeader(http.StatusBadRequest) // 400 错误return}// 模拟ID生成newUser.ID = len(users) + 1users = append(users, newUser)w.WriteHeader(http.StatusCreated) // 201 创建成功json.NewEncoder(w).Encode(newUser)default:w.WriteHeader(http.StatusMethodNotAllowed) // 405 不允许的方法}})// 启动服务器(端口8080)http.ListenAndServe(":8080", nil)
}

2、基础版:

将入门版本的拓展开来:通过函数调用实现。

package mainimport ("encoding/json" // 用于JSON处理"fmt"           // 格式化输出"log"           // 日志记录"net/http"      // HTTP服务
)// 定义用户结构体(相当于数据模型)
type User struct {ID   int    `json:"id"`   // 用户IDName string `json:"name"` // 用户名
}// 内存数据库(暂时替代真实数据库)
var users = []User{{ID: 1, Name: "小明"},{ID: 2, Name: "小红"},
}func main() {fmt.Println("👉 启动RESTful服务器: http://localhost:8080")// 注册路由:当访问 /users 时触发处理函数http.HandleFunc("/users", usersHandler)// 启动服务器(监听8080端口)log.Fatal(http.ListenAndServe(":8080", nil))
}// 处理/users路由的请求
func usersHandler(w http.ResponseWriter, r *http.Request) {// 设置响应头(告诉浏览器返回的是JSON)w.Header().Set("Content-Type", "application/json")switch r.Method {case "GET": // 处理GET请求(查询用户)handleGetUsers(w, r)case "POST": // 处理POST请求(创建用户)handleCreateUser(w, r)default: // 其他请求方法不允许w.WriteHeader(http.StatusMethodNotAllowed) // 405错误fmt.Fprintf(w, `{"error": "不支持该方法"}`)}
}// 处理GET请求(获取所有用户)
func handleGetUsers(w http.ResponseWriter, r *http.Request) {// 将用户列表转为JSON格式jsonData, err := json.Marshal(users)if err != nil {w.WriteHeader(http.StatusInternalServerError) // 500错误fmt.Fprintf(w, `{"error": "数据转换失败"}`)return}// 返回JSON数据w.Write(jsonData)
}// 处理POST请求(创建新用户)
func handleCreateUser(w http.ResponseWriter, r *http.Request) {// 1. 解析请求中的JSON数据var newUser Usererr := json.NewDecoder(r.Body).Decode(&newUser)if err != nil {w.WriteHeader(http.StatusBadRequest) // 400错误fmt.Fprintf(w, `{"error": "无效的JSON数据"}`)return}// 2. 简单的数据验证if newUser.Name == "" {w.WriteHeader(http.StatusBadRequest)fmt.Fprintf(w, `{"error": "用户名不能为空"}`)return}// 3. 生成新ID(实际项目中数据库会自动生成)newUser.ID = len(users) + 1// 4. 添加到用户列表users = append(users, newUser)// 5. 返回创建成功的响应w.WriteHeader(http.StatusCreated) // 201状态码json.NewEncoder(w).Encode(newUser)
}
原理图: 
  客户端 (浏览器/curl)│▼HTTP请求(GET/POST)│▼Go服务器 (main.go)│├── GET /users → 返回用户列表│└── POST /users → 创建新用户│    ├── 解析JSON│    ├── 验证数据│    └── 添加到内存│▼HTTP响应(JSON数据)

3、进阶版:

添加获取单个用户功能GET / users / {id} )(如:get/users/1)

// 在main函数中添加新路由
func main() {// ...原有代码...http.HandleFunc("/users/", userHandler) // 添加带ID的路由
}// 新增处理函数
func userHandler(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "application/json")// 从路径中提取ID:/users/123 → 123idStr := strings.TrimPrefix(r.URL.Path, "/users/")id, err := strconv.Atoi(idStr)if err != nil {w.WriteHeader(http.StatusBadRequest)fmt.Fprintf(w, `{"error": "无效的用户ID"}`)return}// 查找用户var foundUser *Userfor _, u := range users {if u.ID == id {foundUser = &ubreak}}if foundUser == nil {w.WriteHeader(http.StatusNotFound) // 404fmt.Fprintf(w, `{"error": "用户不存在"}`)return}json.NewEncoder(w).Encode(foundUser)
}

恭喜走出新手村!

到这里,差不多,大家就已经明白了Restful风格是什么?怎么用。

后续若抽出时间,我会继续更新呦~😉


谨记:

RESTful = 用HTTP动词(GET/POST...)操作网络资源(URI标识),
目标是简单、统一、好扩展。
简称:"动词操作资源地址",记住这点,你对restful的理解就能掌握90%了 

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

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

相关文章

了解GC吗?什么是GC?

GC是什么?为什么要GC? GC( Garbage Collection ),垃圾回收,是Java与C的主要区别之一。作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码。这是因为在Java虚拟机中,存在自动…

FDMA读写AXI BRAM交互:FPGA高速数据传输的核心技术

在图像处理系统中,当1080P视频流以每秒60帧的速度传输时,传统DMA每帧会浪费27%的带宽在地址管理上——而FDMA技术能将这些损失降至3%以内 现代FPGA系统中,高效数据搬运往往是性能瓶颈的关键所在。当你在手机上流畅播放4K视频、在自动驾驶系统中实时处理激光雷达点云时,背后…

独立开发A/B测试实用教程

A/B测试(A/B Testing),又称分组测试、对照实验,是产品开发和运营中提升转化率、优化用户体验的常用方法。无论你是做App、SaaS、网站还是小程序,合理地利用A/B测试,都能帮助你用数据驱动决策,让…

如何将iPhone备份到Mac/MacBook

许多iPhone用户非常重视备份,但在Mac上选择合适的备份方法可能会令人困惑。市场上有各种各样的备份工具,找到一个既易于使用又能保存所有重要数据(如照片、视频、消息、WhatsApp聊天记录和联系人)的工具至关重要。如果你正在寻找一…

Logseq 插件开发实战四:发布到官方插件市场

🚩系列回顾 初识插件机制并实现自动压缩粘贴的图片国际化 I18N 与配置多语言自定义斜线命令 SlashCommand发布到官方插件市场 开源地址:logseq-plugin-image-tiny,欢迎来⭐。 🐞 插件上线问题记录 问题描述 本地插件开发完成后…

[netty5: ByteToMessageCodec MessageToByteEncoder ByteToMessageDecoder]-源码分析

ByteToMessageCodec ByteToMessageCodec 是一个结合了 ByteToMessageDecoder 和 MessageToByteEncoder 的编解码器&#xff0c;可以实时地将字节流编码或解码为消息&#xff0c;反之亦然。 public abstract class ByteToMessageCodec<I> extends ChannelHandlerAdapter {…

Ubuntu20.04安装mujoco210, mujoco-py时的报错处理

参考 Ubantu 20.04 安装 Mujoco210、mujoco-py、gym及报错解决 安装 mujoco210 创建 .mujoco 文件夹 mkdir ~/.mujoco亲测必须是 .mujoco 文件夹&#xff0c;不然会报错&#xff01; 下载 mujoco210-linux-x86_64.tar.gz 并解压到 .mujoco 文件夹 mojoco下载地址 测试 mojo…

全志T507 音频ALSA核心层注册流程分析

一.ALSA核心层注册流程分析 驱动目录&#xff1a;kernel-4.9/sound/core/sound.c struct file_operations snd_fops {.owner THIS_MODULE,.open snd_open, (inode, file)---->struct snd_minor *mptr snd_minors[minor];---->file->f_op fops_get(mptr->f_ops…

评论区实现 前端Vue

根据后端部分定义评论区功能实现 golang后端部分-CSDN博客&#xff0c;重点需要实现三个部分&#xff0c;1.当前用户发起新根评论请求&#xff1b;2.评论区展示部分&#xff1b;3.某一根评论的子评论展示以及回复组件显示。 整体流程解释 数据从后端接收&#xff0c;整体在in…

差分定位技术:原理、分类与应用场景

文章目录 简介基本概念位置差分伪距差分载波相位 差分定位技术精密单点定位&#xff08;PPP&#xff09;差分全球定位系统&#xff08;DGPS&#xff09;实时动态定位&#xff08;RTK&#xff09; 应用场景总结 简介 差分定位&#xff08;Differential Positioning&#xff09;是…

tomcat的tar包转换成rpm包的保姆级教程

环境说明 &#xff1a;centos 71. 安装打包工具&#xff1a;yum install -y rpm-build rpmdevtools2. 创建 RPM 打包环境&#xff1a;rpmdev-setuptree​输入之后是下面的结果~/rpmbuild/ ├── BUILD ├── RPMS ├── SOURCES ├── SPECS └── SRPMS​准备 Tomcat 源码…

【牛客算法】小美的数组删除

文章目录 一、题目介绍二、解题思路三、解题算法实现四、算法分析4.1 代码逻辑4.2 逆向遍历求MEX的设计精妙之处4.2.1 逆向遍历:解决MEX更新的连续性4.2.2 利用MEX的单调性4.2.3 空间复用与状态压缩4.2.4 与问题特性的完美契合4.2.5 总结:为什么说这个设计“妙”?五、算法复…

MyBatisPlus-01-环境初始化及简单应用

文章目录【README】【1】springboot集成mybatis-plus配置【1.1】目录结构【相关说明】【1.2】代码示例【pom.xml】【application.properties】【MybatisPlusNoteController】【UserAppService】【UserMapper】【UserPO】【建表语句】【2】演示【README】 本文代码参见&#xf…

Web爬虫编程语言选择指南

刚学爬虫的小伙伴常常为选择那种语言来写爬虫而烦恼&#xff0c;今天我将总结几种语言的优劣势&#xff0c;然后选择适合编写 Web爬虫 的编程语言。这就需要我们考虑开发效率、生态库支持、并发性能等因素。以下是主流选择及特点跟着一起看看吧&#xff1a; 1. Python&#xff…

学习日志06 python

加油&#xff0c;今天的任务是学习面向对象编程&#xff0c;设计一个简单的宠物管理系统&#xff08;宠物类、猫 / 狗子类&#xff09;&#xff0c;先做5道题目开启学习状态吧&#xff01;1 setdefault()在 Python 中&#xff0c;setdefault() 是字典&#xff08;dict&#xff…

基于Java+springboot 的车险理赔信息管理系统

源码、数据库、包调试源码编号&#xff1a;S595源码名称&#xff1a;基于springboot 的车险理赔信息管理系统用户类型&#xff1a;多角色&#xff0c;用户、事故调查员、管理员数据库表数量&#xff1a;14 张表主要技术&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven运…

MyDockFinder 绿色便携版 | 一键仿Mac桌面,非常简单

如果你既不想升级到Win11&#xff0c;又想体验Mac桌面的高级感&#xff0c;那么MyDockFinder将是你的最佳选择。这是一款专为Windows系统设计的桌面美化工具&#xff0c;能够将你的桌面转变成MacOS的风格。它提供了类似Dock栏和Finder的功能&#xff0c;让你在不更换操作系统的…

Babylon.js 材质克隆与纹理共享:你可能遇到的问题及解决方案

在 Babylon.js 中&#xff0c;材质&#xff08;Material&#xff09;和纹理&#xff08;Texture&#xff09;的克隆行为可能会影响渲染性能和内存管理&#xff0c;尤其是在多个材质共享同一纹理的情况下。本文将探讨&#xff1a;PBRMetallicRoughnessMaterial 的克隆机制&#…

信息素养复赛模拟1和模拟2的编程题标程

信息素养复赛模拟 11&#xff1a;楼层编号 #include<bits/stdc.h> using namespace std; int main(){int n, t;cin >> n >> t;int res 0;for(int i 1; i < n; i ){int x i;bool ok true;while(x){if(x % 10 t){ok false;}x / 10;}res ok;} cout &l…

Hadoop高可用集群搭建

Hadoop高可用(HA)集群是企业级大数据平台的核心基础设施&#xff0c;通过多主节点冗余和自动故障转移机制&#xff0c;确保系统在单点故障时仍能正常运行。本文将详细介绍如何基于CentOS 7搭建Hadoop 3.X高可用集群&#xff0c;涵盖环境准备、组件配置、集群启动及管理的全流程…