HTTP 状态码
意义
每个状态码都是 HTTP 设计者对网络通讯中可能出现情况的假设与预判。它相当于现实世界的信号灯,例如遇到 404 表示资源找不到,遇到 500 表示服务器内部错误。这种共识是万维网高效率的基础之一。
HTTP 状态码是日常开发与调试的必备工具。常见状态码分类如下:
Go Web 开发的基础理论,涵盖 HTTP 状态码分类与含义、HTTP 协议核心模型及版本演进、缓存机制与 HTTPS 原理。详细讲解了使用 sqlx 包进行 MySQL 数据库的连接与增删改查操作,以及 Cookie 和 Session 的会话管理机制。此外,还包含了模板引擎的使用、文件上传下载的代码实现、控制器模式的区别,以及 GET 与 POST 请求在语义、参数、幂等性和缓存方面的核心差异。

每个状态码都是 HTTP 设计者对网络通讯中可能出现情况的假设与预判。它相当于现实世界的信号灯,例如遇到 404 表示资源找不到,遇到 500 表示服务器内部错误。这种共识是万维网高效率的基础之一。
HTTP 状态码是日常开发与调试的必备工具。常见状态码分类如下:
排查问题时常用:
示例:https://www.example.com:8080/path?name=test#fragment
https:协议类型。www.example.com:域名(对应服务器 IP)。8080:端口(HTTP 默认 80,HTTPS 默认 443,可省略)。/path:资源路径。?name=test:GET 携带的参数。#fragment:锚点。Cache-Control: max-age=3600 告诉浏览器 1 小时内强制使用本地缓存。If-Modified-Since 或 Etag 请求,服务器判断未修改则返回 304。HTTPS = HTTP + TLS。
Set-Cookie 在客户端存储信息,解决 HTTP 无状态问题。session_id 关联。跨域指协议、域名或端口不同。解决方案是服务器返回 Access-Control-Allow-Origin 响应头,允许指定域名的跨域请求。
本文通过 sqlx 包操作数据库。
import (
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
DB, err := sqlx.Open("mysql", "root:1234@tcp(localhost:3306)/goweb?parseTime=true&loc=Local")
if err != nil {
// handle error
}
err = DB.Ping()
queryCreate := "insert into user (id, name) values (?, ?)"
queryDelete := "delete from user where id = ?"
queryUpdate := "update user set name = ? where id = ?"
queryQuery := "select * from user"
// 执行
DB.Exec(queryCreate, 1, "白小纯")
DB.Exec(queryDelete, 1)
DB.Exec(queryUpdate, "夜藏", 1)
rows, err := DB.Query(queryQuery)
for rows.Next() {
var id int
var name string
rows.Scan(&id, &name)
}
Cookie 源于 Unix 中的 "magic cookie",用于程序间传递特定信息。后端核心操作示例:
func serv(w http.ResponseWriter, r *http.Request) {
// 设置 Cookie
cookie := &http.Cookie{
Name: "session_id",
Value: "cookie",
Expires: time.Now().Add(time.Second),
}
http.SetCookie(w, cookie)
// 获取单个 Cookie
c, _ := r.Cookie("session_id")
fmt.Fprintln(w, c.Name, c.Value, c.Expires)
// 循环获取所有 Cookie
cs := r.Cookies()
for _, co := range cs {
fmt.Fprintln(w, co.Name, co.Value)
}
}
模板引擎用于解耦控制器(Controller)与视图(View)。它是包含占位符与控制逻辑的预制文本,通过动态填充输出。
func temp(w http.ResponseWriter, r *http.Request) {
add := template.FuncMap{"add": Add}
t := template.New("index").Funcs(add)
t, _ = t.ParseFiles("new_add")
t.Execute(w, nil)
}
前端模板语法:{{add 0 0}}
从浏览器向服务器传输数据。 HTML:
<form action="upload" enctype="multipart/form-data" method="post">
上传照片:<input type="file" name="photo">
</form>
Go Handler:
func upload(w http.ResponseWriter, r *http.Request) {
f, _, _ := r.FormFile("photo")
b, _ := io.ReadAll(f)
err := os.WriteFile("/tmp/photo", b, 0777)
if err != nil {
fmt.Println("失败")
}
}
<a href="/download?filename=file.png">点击我下载</a>
func download(w http.ResponseWriter, r *http.Request) {
name := r.FormValue("filename")
data, _ := os.ReadFile("./files/" + name)
h := w.Header()
h.Set("Content-Type", "application/octet-stream")
h.Set("Content-Disposition", "attachment; filename=photo")
w.Write(data)
}
实现 http.Handler 接口。
type myStruct struct{}
func (m myStruct) ServeHTTP(w http.ResponseWriter, r *http.Request) {}
func main() {
s := http.Server{
Addr: "localhost:8888",
Handler: myStruct{},
}
s.ListenAndServe()
}
使用 http.HandleFunc 注册路由。
func Test(w http.ResponseWriter, r *http.Request) {}
func main() {
http.HandleFunc("/url", Test)
s := http.Server{Addr: "localhost:8888"}
s.ListenAndServe()
}
| 角度 | GET | POST |
|---|---|---|
| 语义 | 获取资源 | 提交资源 |
| 参数 | URL 中 | 请求体 |
| 幂等性 | 幂等(多次结果不变) | 非幂等(可能多次下单) |
| 缓存 | 易被缓存 | 一般不缓存 |

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online