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.rhkb.cn/news/457587.html

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

相关文章

【C++】string类 (模拟实现详解 下)

我们接着上一篇【C】string类 &#xff08;模拟实现详解 上&#xff09;-CSDN博客继续对string模拟实现。从这篇内容开始&#xff0c;string相关函数的实现就要声明和定义分离了。 1.reserve、push_back和append 在string.h的string类里进行函数的声明。 void reserve(size_…

Maven项目报错:invalid LOC header (bad signature)

文章目录 Maven项目报错&#xff1a;invalid LOC header (bad signature)1. Maven项目加载或Pom.Xml刷新后仍出现如下错误2. 解决方法 Maven项目报错&#xff1a;invalid LOC header (bad signature) 1. Maven项目加载或Pom.Xml刷新后仍出现如下错误 错误提示&#xff1a; in…

【Spring MVC】请求参数的获取

我的主页 1. 获取 URL 中的参数 获取 URL 中的参数是通过 PathVariable 注解实现的 RequestMapping("/article/{articleId}") public String method12(PathVariable("articleId") String articleId){return "接收到参数articleId: " articleI…

书生第四期作业:L0G4000 任务作业

模型下载 在github-codespace 登录codespace安装依赖&#xff1a; 运行下载的py文件&#xff0c;下载模型配置文件&#xff0c; 下载完成 在intern-studio开发机 下载配置文件 下载完成

2024系统架构师---真题考试知识点

1.逻辑地址的构成是“逻辑地址&页内地址”&#xff0c;而物理地址的构成“物理块号&页内地址”&#xff0c;因此只要找出逻辑地址中那几位表示逻辑页号基本就完成了。页内大小4k4*2的10次方2的12次方&#xff0c;可以得出页内地址占12位&#xff0c;因此1B1AH的后12位&…

群控系统服务端开发模式-系统架构图

一、开发服务(1.0版本)&#xff1a; 平台前端服务、平台api接口服务、国外api处理服务&#xff1b; 二、开发服务(2.0版本)&#xff1a; 国内客户端前端服务、国内客户端api接口服务、国外客户端前端服务、国外客户端api接口服务&#xff1b; 三、运行服务(1.0版本)&#xff…

JavaWeb合集22-Apache POI

二十二、Apache POI Apache POI是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用POI在Java 序中对Miscrosoft Office各种文件进行读写操作。一般情况下&#xff0c;POI都是用于操作Excel文件。 使用场景&#xff1a;银行网银系统导出…

【Android】Kotlin教程(2)

文章目录 1.空安全2.let安全调用3.非空断言操作符!!4.空合并操作符 ?:5.异常6.先决条件函数7.substring8.split函数9.replace10.字符串比较11.安全转换函数12.标准库函数1.apply2.run3.with4.also5.takeIf6.takeUnless 1.空安全 为了避免NullPointerException&#xff0c;Kot…

【2024|滑坡数据集论文解读3】CAS滑坡数据集:用于深度学习滑坡检测的大规模多传感器数据集

【2024|滑坡数据集论文解读3】CAS滑坡数据集&#xff1a;用于深度学习滑坡检测的大规模多传感器数据集 【2024|滑坡数据集论文解读3】CAS滑坡数据集&#xff1a;用于深度学习滑坡检测的大规模多传感器数据集 文章目录 【2024|滑坡数据集论文解读3】CAS滑坡数据集&#xff1a;用…

计算机网络(十二) —— 高级IO

#1024程序员节 | 征文# 目录 一&#xff0c;预备 1.1 重新理解IO 1.2 五种IO模型 1.3 非阻塞IO 二&#xff0c;select 2.1 关于select 2.2 select接口参数解释 2.3 timeval结构体和fd_set类型 2.4 socket就绪条件 2.5 select基本工作流程 2.6 简单select的服务器代…

c++编解码封装

多态版编解码 对服务器和客户端的结构体进行序列化然后对数据进行反序列化 案例分析 代码demo Codec.h #pragma once #include <iostream>class Codec { public:Codec();virtual std::string encodeMsg();//string是标准库的string类virtual void* decodeMsg();virtu…

西瓜书《机器学习》符号表KaTex表示

写这篇post的缘故是最近整理机器学习的相关公式&#xff0c;经常要用到KaTex, 但网络上搜索到的西瓜书符号表的表示有些并不准确或不严谨&#xff0c;本着严谨治学的态度&#xff0c;整理了一下符号表的KaTex表示&#xff0c;希望有所帮助,整理过程中参考了《南瓜书》和 KaTex官…

Flutter TextField和Button组件开发登录页面案例

In this section, we’ll go through building a basic login screen using the Button and TextField widgets. We’ll follow a step-bystep approach, allowing you to code along and understand each part of the process. Let’s get started! 在本节中&#xff0c;我们…

软件系统建设方案书(word参考模板)

1 引言 1.1 编写目的 1.2 项目概述 1.3 名词解释 2 项目背景 3 业务分析 3.1 业务需求 3.2 业务需求分析与解决思路 3.3 数据需求分析【可选】 4 项目建设总体规划【可选】 4.1 系统定位【可选】 4.2 系统建设规划 5 建设目标 5.1 总体目标 5.2 分阶段目标【可选】 5.2.1 业务目…

ctfshow(259->261)--反序列化漏洞--原生类与更多魔术方法

Web259 进入界面&#xff0c;回显如下&#xff1a; highlight_file(__FILE__);$vip unserialize($_GET[vip]); //vip can get flag one key $vip->getFlag();题干里还提示了网站有一个flag.php界面&#xff0c;源代码如下&#xff1a; $xff explode(,, $_SERVER[HTTP_X…

Docker容器操作

Docker容器操作 启动容器 docker run -it 镜像名(镜像id) bash当利用docker run来创建容器时&#xff0c;Docker在后台运行的标准操作包括&#xff1a; 检查本地是否存在指定的镜像&#xff0c;不存在就从公有仓库中下载利用镜像创建并启动一个容器分配一个文件系统&#xf…

C语言实现Go的defer功能

之前笔者写了一篇博文C实现Go的defer功能&#xff0c;介绍了如何在C语言中实现Go的defer功能&#xff0c;那在C语言中是否也可以实现这样的功能呢&#xff1f;本文就将介绍一下如何在C语言中实现Go的defer功能。 我们还是使用C实现Go的defer功能中的示例&#xff1a; void te…

医院信息化与智能化系统(9)

医院信息化与智能化系统(9) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应的…

改进YOLOv8系列:引入低照度图像增强网络Retinexformer | 优化低光照目标检测那题

改进YOLOv8系列:引入低照度图像增强网络Retinexformer | 优化低光照目标检测那题 🚀论文研究概括🚀加入到网络中的理论研究🚀需要修改的代码1 🍀🍀Retinexformer 代码2🍀🍀tasks里引用🚀创建yaml文件🚀测试是否创建成功前言:这篇论文提出了一种用于低光图像…

STM32应用详解(10)I2C总线初始化

文章目录 前言一、I2C总线初始化二、程序源码与详解1.I2C初始化2.I2C端口初始化及设置IO端口工作模式3.函数I2C_Init4.函数I2C_Cmd5.使能APB1外设时钟6.I2C通信时序图 前言 介绍STM32的I2C总线初始化&#xff0c;给出了代码详解。《i2c.h》文件&#xff0c;由用户编写。定义了…