Go 语言 HTTP 协议与 RESTful API 实训全解(理论 + 实战 + 规范)

🏷️ 标签:Go HTTP RESTful API Web开发 后端实训 📝 适用人群:Go 初学者、Web 开发入门、课程实训、毕业设计 💡 核心亮点:理论易懂、实战可跑、完全符合课程实训报告格式


一、前言

在现代 Web 开发中,HTTP 协议 是前后端交互的基础,RESTful API 是目前最主流的接口设计规范。 Go 语言内置强大的 net/http 标准库,可以不依赖任何框架,快速开发高性能 RESTful API。

本文是标准实训教程,包含:

  • HTTP 协议核心知识点
  • RESTful API 设计规范
  • Go 原生实现 RESTful API(完整 CRUD)
  • 请求处理、参数获取、JSON 响应、路由规范
  • 实训总结与作业

内容适合课程实验、实训报告、CSDN 技术博客发布。


二、HTTP 协议概述

2.1 什么是 HTTP

HTTP(HyperText Transfer Protocol)超文本传输协议,是一种无状态、应用层协议,基于 TCP 传输。

2.2 HTTP 特点

  • 基于请求 / 响应模型
  • 无状态(每次请求独立)
  • 可靠传输(基于 TCP)
  • 通用、可扩展

2.3 HTTP 请求结构

  • 请求行(方法、URL、协议)
  • 请求头
  • 空行
  • 请求体

2.4 HTTP 响应结构

  • 状态行
  • 响应头
  • 空行
  • 响应体

2.5 HTTP 常用请求方法(RESTful 核心)

方法 作用 幂等
GET 查询资源
POST 新增资源
PUT 全量更新
PATCH 部分更新
DELETE 删除资源

2.6 HTTP 常用状态码

  • 200 成功
  • 201 创建成功
  • 400 参数错误
  • 401 未授权
  • 403 禁止访问
  • 404 资源不存在
  • 500 服务器错误

三、RESTful API 设计规范

RESTful 是一种接口设计风格 ,核心是用 URL 表示资源,用 HTTP 方法表示操作

3.1 核心原则

  • 用名词复数表示资源
    • /users
    • /orders
    • /products
  • 用 HTTP 方法表示行为
    • GET 查询
    • POST 新增
    • PUT 更新
    • DELETE 删除
  • 用状态码表示结果
  • 用 JSON 做数据交互
  • 版本控制:/v1/users

3.2 标准 RESTful 接口示例

接口 作用
GET /users 查询所有用户
GET /users/1 查询单个用户
POST /users 新增用户
PUT /users/1 更新用户
DELETE /users/1 删除用户

四、Go 原生 HTTP 开发 API 基础

Go 内置 net/http,开箱即用,性能极高。

4.1 最简单 HTTP 服务

复制代码
package main

import "net/http"

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello Go HTTP"))
	})
	http.ListenAndServe(":8080", nil)
}

4.2 获取请求信息

复制代码
// 请求方法
r.Method
// 请求URL
r.URL.Path
// 请求头
r.Header.Get("Content-Type")
// 获取GET参数
r.URL.Query().Get("name")

4.3 返回 JSON 数据(RESTful 必备)

复制代码
import "encoding/json"

func hello(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "application/json")
	data := map[string]string{
		"msg": "success",
	}
	json.NewEncoder(w).Encode(data)
}

五、RESTful API 实训实战(用户 CRUD)

我们使用 Go 原生标准库,实现一套完整的用户管理 CRUD 接口。

5.1 项目结构

复制代码
go-rest-api/
├── main.go        # 入口 + 路由
├── handler
│   └── user.go    # 接口处理
├── model
│   └── user.go    # 数据模型

5.2 模型定义(model/user.go)

复制代码
package model

type User struct {
	ID   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

// 模拟数据库
var Users = []User{
	{ID: 1, Name: "张三", Age: 20},
	{ID: 2, Name: "李四", Age: 22},
}

5.3 用户接口实现(handler/user.go)

复制代码
package handler

import (
	"encoding/json"
	"net/http"
	"strconv"

	"go-rest-api/model"
)

// 获取所有用户 GET /users
func GetUsers(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(model.Users)
}

// 获取单个用户 GET /users/1
func GetUser(w http.ResponseWriter, r *http.Request) {
	idStr := r.URL.Path[len("/users/"):]
	id, _ := strconv.Atoi(idStr)
	for _, u := range model.Users {
		if u.ID == id {
			json.NewEncoder(w).Encode(u)
			return
		}
	}
	http.Error(w, "not found", 404)
}

// 新增用户 POST /users
func AddUser(w http.ResponseWriter, r *http.Request) {
	var u model.User
	json.NewDecoder(r.Body).Decode(&u)
	u.ID = len(model.Users) + 1
	model.Users = append(model.Users, u)
	w.WriteHeader(201)
	json.NewEncoder(w).Encode(u)
}

// 更新用户 PUT /users/1
func UpdateUser(w http.ResponseWriter, r *http.Request) {
	idStr := r.URL.Path[len("/users/"):]
	id, _ := strconv.Atoi(idStr)
	for i := range model.Users {
		if model.Users[i].ID == id {
			json.NewDecoder(r.Body).Decode(&model.Users[i])
			json.NewEncoder(w).Encode(model.Users[i])
			return
		}
	}
	http.Error(w, "not found", 404)
}

// 删除用户 DELETE /users/1
func DeleteUser(w http.ResponseWriter, r *http.Request) {
	idStr := r.URL.Path[len("/users/"):]
	id, _ := strconv.Atoi(idStr)
	for i, u := range model.Users {
		if u.ID == id {
			model.Users = append(model.Users[:i], model.Users[i+1:]...)
			w.WriteHeader(204)
			return
		}
	}
	http.Error(w, "not found", 404)
}

5.4 路由与入口(main.go)

复制代码
package main

import (
	"net/http"

	"go-rest-api/handler"
)

func main() {
	http.HandleFunc("GET /users", handler.GetUsers)
	http.HandleFunc("GET /users/{id}", handler.GetUser)
	http.HandleFunc("POST /users", handler.AddUser)
	http.HandleFunc("PUT /users/{id}", handler.UpdateUser)
	http.HandleFunc("DELETE /users/{id}", handler.DeleteUser)

	http.ListenAndServe(":8080", nil)
}

六、接口测试(实训报告必备)

接口 方法 功能
http://127.0.0.1:8080/users GET 获取所有
http://127.0.0.1:8080/users/1 GET 获取单个
http://127.0.0.1:8080/users POST 新增
http://127.0.0.1:8080/users/1 PUT 更新
http://127.0.0.1:8080/users/1 DELETE 删除

POST 示例请求体:

复制代码
{
	"name": "王五",
	"age": 23
}

七、实训总结

本次实训学习了:

  1. HTTP 协议的请求响应、方法、状态码
  2. RESTful API 设计规范(资源 + 方法)
  3. Go 标准库 net/http 开发 Web 服务
  4. 实现 用户 CRUD RESTful API
  5. JSON 数据交互、路由、参数处理

Go 原生 HTTP 简洁、高效、无依赖,非常适合快速开发 RESTful API。


版权声明

本文为 Go 语言 HTTP 与 RESTful API 实训教程,适合课程实验、学习报告、CSDN 发布,禁止未经授权转载、抄袭、搬运。

相关推荐
XMYX-02 小时前
36 - Go exec 执行命令
开发语言·golang
一只小逸白3 小时前
LeetCode Go 常用函数速查表
linux·leetcode·golang
LCG元3 小时前
【Go后端开发】从 0 到生产级:高性能分布式网关全实现 + 接口限流熔断降级实战
分布式·golang·wpf
长谷深风1113 小时前
HTTP请求全过程解析【个人八股】
网络·网络协议·http·多线程下载·tcp 连接·请求报文、响应报文·网络请求流程
艾莉丝努力练剑3 小时前
【Linux网络】Linux 网络编程:HTTP(四)从手写服务器到生产级 Nginx 与 cpp-httplib 实战
linux·运维·服务器·网络·c++·nginx·http
艾莉丝努力练剑4 小时前
【Linux网络】Linux 网络编程:HTTP(三)HTTP 协议原理
linux·运维·服务器·网络·c++·http
姚不倒14 小时前
Go语言进阶:接口、错误处理与并发编程(goroutine/channel/context)
云原生·golang
宇明一不急21 小时前
go 链表 (标准库实现)
开发语言·链表·golang
~|Bernard|1 天前
GO语言中哪些类型是可比较类型的(==和!=)
开发语言·后端·golang