15分钟学 Go 小项目:Web API

Web API

在现代应用开发中,Web API(应用程序编程接口)是实现系统间交互的关键。通过理解HTTP协议、路由、RESTful设计原则,我们可以设计出高效、可维护的API。接下来,我们将深入探讨这些主题,并以一个简单的Go语言项目作为示例。

第一部分:理解HTTP和路由

1.1 HTTP协议概述

HTTP(超文本传输协议)是Web上数据通信的基础。它是一个请求-响应协议,客户端(通常是用户的浏览器或应用程序)发送请求并接收服务器的响应。HTTP的主要组成部分包括:

  • 请求方法:常见的有 GETPOSTPUTDELETE
  • URL:Uniform Resource Locator,用于定位网络资源
  • 状态码:表示请求处理的结果,例如 200 OK404 Not Found
1.2 HTTP请求方法
方法描述
GET请求指定的资源; 不应产生任何副作用(获取数据)
POST提交数据到指定资源; 可能产生副作用
PUT更新指定的资源或创建新资源
DELETE删除指定的资源
1.3 路由

在Go中,路由是将HTTP请求映射到相应的处理函数的过程。常用的Go路由库有:

  • net/http:Go的标准库,简单易用
  • Gorilla Mux:功能强大的第三方路由库

第二部分:RESTful设计原则

REST(Representational State Transfer)是一种架构风格,强调无状态的、可缓存的交互。RESTful API应遵循以下原则:

  1. 资源导向:API的每个URL代表一个资源。
  2. 使用HTTP方法:通过HTTP方法(GET、POST、PUT、DELETE)来执行资源的操作。
  3. 无状态:每个请求都应包含完成请求所需的所有信息,服务器不应存储客户端状态。
  4. 可缓存:响应应标识是否可缓存,以提高性能。
  5. 统一接口:通过统一的接口简化交互。

第三部分:实战项目——构建一个简单的RESTful API

3.1 项目需求

我们将创建一个简单的图书管理系统,包括如下功能:

  1. 获取所有图书
  2. 添加新图书
  3. 更新图书信息
  4. 删除图书
3.2 项目结构
bookapi/
├── main.go
└── books.go

3.3 代码实现

3.3.1 main.go

此文件是整个API的入口,使用 net/http 库处理请求和路由。

package mainimport ("encoding/json""net/http""github.com/gorilla/mux"
)func main() {router := mux.NewRouter()router.HandleFunc("/books", GetBooks).Methods("GET")router.HandleFunc("/books", CreateBook).Methods("POST")router.HandleFunc("/books/{id}", UpdateBook).Methods("PUT")router.HandleFunc("/books/{id}", DeleteBook).Methods("DELETE")http.ListenAndServe(":8000", router)
}
3.3.2 books.go

此文件包含图书数据结构及相关操作的实现。

package mainimport ("encoding/json""net/http""strconv""github.com/gorilla/mux"
)type Book struct {ID     int    `json:"id"`Title  string `json:"title"`Author string `json:"author"`
}var books []Book
var nextID = 1func GetBooks(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(books)
}func CreateBook(w http.ResponseWriter, r *http.Request) {var book Book_ = json.NewDecoder(r.Body).Decode(&book)book.ID = nextIDnextID++books = append(books, book)w.WriteHeader(http.StatusCreated)json.NewEncoder(w).Encode(book)
}func UpdateBook(w http.ResponseWriter, r *http.Request) {params := mux.Vars(r)id, _ := strconv.Atoi(params["id"])for index, book := range books {if book.ID == id {var updatedBook Book_ = json.NewDecoder(r.Body).Decode(&updatedBook)updatedBook.ID = book.IDbooks[index] = updatedBookjson.NewEncoder(w).Encode(updatedBook)return}}w.WriteHeader(http.StatusNotFound)
}func DeleteBook(w http.ResponseWriter, r *http.Request) {params := mux.Vars(r)id, _ := strconv.Atoi(params["id"])for index, book := range books {if book.ID == id {books = append(books[:index], books[index+1:]...)w.WriteHeader(http.StatusNoContent)return}}w.WriteHeader(http.StatusNotFound)
}
3.4 代码运行流程

以下是代码的运行流程图:

+------------------+
|     Client       |
+------------------+|| 1. Request (GET /books)v
+------------------+
|    main.go       |
+------------------+
|    GetBooks()    |--------------+
|                  |              |
+------------------+              ||                         || 2. Response (200 OK)   |v                         |
+------------------+              |
|  Returns JSON    |<-------------+
|   Array of Books |
+------------------+

第四部分:测试API

使用Postman或curl可以测试构建的API。

4.1 获取所有图书
curl -X GET http://localhost:8000/books
4.2 添加新图书
curl -X POST http://localhost:8000/books -d '{"title":"Go语言入门", "author":"张三"}'
4.3 更新图书
curl -X PUT http://localhost:8000/books/1 -d '{"title":"Go语言进阶", "author":"李四"}'
4.4 删除图书
curl -X DELETE http://localhost:8000/books/1

第五部分:项目总结

通过以上实现,我们了解了如何使用Go语言构建一个RESTful API,包括HTTP路由、响应处理和数据存储的基本功能。该项目展示了如何通过函数注入来实现清晰的代码结构,并利用第三方库如Gorilla Mux来简化路由逻辑。

深入学习建议

  • 了解更多HTTP状态码:如401 Unauthorized、403 Forbidden等
  • 使用中间件:如日志记录、认证等,增强API能力。
  • 连接数据库:为图书管理系统引入数据库(如MySQL或MongoDB)。
  • API文档:使用Swagger等工具生成API文档,提高可用性。

总结

本教程展示了如何在Go语言中创建一个简单的Web API,掌握HTTP路由和RESTful设计的基础知识。希望这一切能为你后续的开发打下坚实的基础,并在未来的项目中应用所学的知识。


怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

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

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

相关文章

Android SDK Version 33: ActivityCompat.requestPermissions不弹框

文章目录 异常现象原因 异常现象 使用Android进行权限判断时&#xff0c;ActivityCompat.requestPermissions不弹框。API为33 原因 从API33开始&#xff0c;为了优化用户体验&#xff0c;只有App全部加载完成并可用后&#xff0c;才会弹授权框。也就说&#xff0c;不能在onC…

软件评测第二期

《遥远的救世主》&#xff0c;自己得想办法&#xff0c;不断地救赎自己了&#xff0c;同时开源竞争&#xff0c;开源竞争&#xff08;自己没有办法完全掌握技术的时候就开源掉&#xff0c;培养出更多的技术依赖&#xff0c;让更多人完善你的技术&#xff0c;那么这不就是在砸罐…

查找算法简记

一、简单查找&#xff08;顺序查找&#xff09; 最基本的查找&#xff0c;相当于遍历&#xff0c;从头到尾一个一个找。 二、二分查找 1、简述 二分查找的输入是一个有序的元素列表。 如果要查找的元素包含在列表中&#xff0c;二分查找返回其位置&#xff1b; 否则返回null。…

开发流程初学者指南——需求分析

目录 从零开始理解需求分析什么是需求分析&#xff1f;需求分析的目标需求分析的基本原则需求分析的各个阶段需求分析的常用方法和工具编写需求文档总结 从零开始理解需求分析 需求分析是软件开发过程中不可或缺的一环&#xff0c;它帮助我们明确用户的需求&#xff0c;确保最…

大模型,多模态大模型面试【LoRA,分类,动静态数据类型,DDPM,ControlNet,IP-Adapter, Stable Diffusion】

大模型&#xff0c;多模态大模型面试【LoRA&#xff0c;分类&#xff0c;动静态数据类型&#xff0c;DDPM&#xff0c;ControlNet&#xff0c;IP-Adapter, Stable Diffusion】 问题一&#xff1a;LoRA是用在节省资源的场景下&#xff0c;那么LoRA具体是节省了内存带宽还是显存呢…

数据结构之链式结构二叉树的实现(进阶版)

本篇文章主要讲解链式二叉树的层序遍历以及判断是否为一棵完全二叉树 二者将会用到之前学过的队列知识&#xff0c;是将队列和二叉树的整合 一、如何将之前已经写好的文件加入当前的编译界面 如图所示&#xff0c;打开我们需要加入文件所在的文件夹&#xff0c;找到我们要加…

StructRAG简介

StructRAG是一种新型的框架&#xff0c;旨在提升大型语言模型&#xff08;LLMs&#xff09;在知识密集型推理任务中的性能。它通过推理时的混合信息结构化机制&#xff0c;根据任务需求以最合适的格式构建和利用结构化知识。 以下是StructRAG的核心组成部分和工作流程&#xff…

Windows Server NTFS磁盘变RAM的处理过程

问题描述 客户服务器的磁盘数据爆满&#xff0c;需要将磁盘进行扩容&#xff0c;因为是虚拟机所以先在虚拟化平台上将原来的磁盘空间改大&#xff0c;再进入系统&#xff0c;在磁盘管理器上将需要扩容的磁盘进行扩展。扩展完后系统报文件系统有问题&#xff0c;扩容的磁盘容量…

LLaMA Factory 核心原理讲解

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…

如何让反向代购客户享受丝滑般的下单之旅?

想象一下&#xff0c;一键下单&#xff0c;轻松购物&#xff0c;仿佛穿越时空的魔法&#xff0c;让中国好货瞬间触手可及&#xff01;从made in china的美妆神器到潮流服饰&#xff0c;从尖端数码产品到温馨家居用品&#xff0c;从令人垂涎的美食到贴心的母婴用品&#xff0c;这…

解决Selenium的3大痛点!这款工具让你的自动化测试效率翻倍!

相信使用过Selenium WebDriver的小伙伴对其最大的诟病有3点&#xff0c;一是浏览器的driver和版本对应问题&#xff0c;第二是Selenium的执行速度&#xff0c;最后一个槽点是对页面元素文本值的断言非常不便。 在我们长期维护大量UI自动化测试用例的过程中这些痛点会让我们耗费…

UI设计公司—兰亭妙微—提供优秀的医疗行业UI设计

医疗行业界面解决方案以医患使用者为中心&#xff0c;遵循行业使用习惯和表达方式&#xff0c;优化使用流程、设计简洁、人性化的操作界面&#xff0c;采用插画、三维动画、微动效的创作方法&#xff0c;让用户感受到愉悦易用美观的使用体验。蓝蓝设计与知名企业合作项目有&…

5G基础知识

什么是 FDD 频分双工&#xff08;Frequency Division Duplexing&#xff09;&#xff0c;理解起来很简单&#xff0c;就是把上行和下行业务隔离在两个频段&#xff0c;互不干扰。 而 TDD 时分双工&#xff08;Time-Division Duplexing&#xff09;&#xff0c;是指上行下业务完…

使用 Elastic Observability 监控 dbt 管道

作者&#xff1a;来自 Elastic Almudena Sanz Oliv•Tamara Dancheva 了解如何使用 Elastic 设置 dbt 监控系统&#xff0c;该系统可主动发出数据处理成本峰值、每张表的行数异常以及数据质量测试失败的警报。 在 Elastic 可观察性组织内的数据分析团队中&#xff0c;我们使用 …

网站攻击,XSS攻击的类型

XSS&#xff08;跨站脚本&#xff09;攻击是一种网络安全攻击方式&#xff0c;攻击者通过在网站页面中注入恶意脚本&#xff0c;使脚本在其他用户的浏览器中执行&#xff0c;从而窃取用户信息、篡改页面内容或操控用户账户。这类攻击通常利用网站对输入数据的过滤不严格&#x…

数据库 示例解析

描述&#xff1a; 找出顾客订单中所花运费比他所下订单平均运费的两倍都还贵的订单号&#xff0c;列出cOrderNo。运费属性名为mShippingCost&#xff0c;顾客号属性为cCustomerID。 代码示例&#xff1a; SELECT o.cOrderNo FROM orders o WHERE o.mShippingCost > (SELE…

2023年信息安全工程师摸底测试卷

目录 1.密码算法 2.等级保护 3.密码学 4.安全评估 5.网络安全控制技术 6.恶意代码 7.身份认证 8.资产管理 9.密码分类 10.被动攻击 11.商用密码服务​编辑 12.超文本传输协议 13.数字水印技术 14.信息系统安全设计 15.重放攻击 16.信息资产保护 17.身份认证 …

大数据治理:确保数据价值与合规性的战略框架

大数据治理&#xff1a;确保数据价值与合规性的战略框架 引言 在信息技术迅猛发展的今天&#xff0c;数据已成为推动企业增长和创新的关键资源。根据统计&#xff0c;全球数据的生成量在每两年内翻一番&#xff0c;预计到2025年&#xff0c;全球数据总量将达到175ZB&#xff…

linux驱动—在自己的总线目录下创建属性文件

在总线目录下创建属性文件以扩展其功能。 通过创建属性文件&#xff0c; 我们可以为总线添加额外的信息和控制选项&#xff0c; 以便与设备和驱动进行交互。 简单就是&#xff0c;属性文件&#xff0c;可以完成用户空间和内核空间的数据交互&#xff0c; 比如在应用层快速修改g…

R向量运算数组矩阵

向量的运算 向量的加减乘除可以直接进运行&#xff0c;不用循环 向量之间的运算&#xff1a;分别对应计算&#xff0c;不用循环 两个运算的向量可以不是长度相等&#xff0c;但是一定长度要成整数倍。 每种运算都可以返回逻辑值T或F 取整函数 保留小数位用round&#xff1a; …