Go 网络编程:HTTP服务与客户端开发

Go 在标准库中内置了功能强大的 net/http 包,可快速构建高并发、高性能的 HTTP 服务,广泛应用于微服务、Web后端、API中间层等场景。


一、快速创建一个HTTP服务

示例:最简Hello服务

go 复制代码
package main

import (
    "fmt"
    "net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, Go Web!")
}

func main() {
    http.HandleFunc("/", helloHandler)
    fmt.Println("Listening on http://localhost:8080/")
    http.ListenAndServe(":8080", nil)
}

二、请求与响应对象详解

  • http.Request:封装了客户端请求的所有信息(URL、Header、Body等)
  • http.ResponseWriter:用于构造服务器的响应

示例:获取请求信息

swift 复制代码
func infoHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Method: %s\n", r.Method)
    fmt.Fprintf(w, "URL: %s\n", r.URL.Path)
    fmt.Fprintf(w, "Header: %v\n", r.Header)
}

三、处理URL参数与POST数据

1. 获取查询参数

scss 复制代码
func queryHandler(w http.ResponseWriter, r *http.Request) {
    name := r.URL.Query().Get("name")
    fmt.Fprintf(w, "Hello, %s!", name)
}

访问:http://localhost:8080/query?name=Go

2. 处理表单数据(POST)

scss 复制代码
func formHandler(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    username := r.FormValue("username")
    fmt.Fprintf(w, "Welcome, %s!", username)
}

四、自定义HTTP路由与Handler

使用 http.ServeMux

css 复制代码
func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/hello", helloHandler)
    mux.HandleFunc("/info", infoHandler)
    http.ListenAndServe(":8080", mux)
}

使用第三方路由器(如 gorilla/muxchi 等)

arduino 复制代码
// 示例略,可根据需要引入第三方库

五、构建HTTP客户端请求

Go 提供了强大的 http.Client 支持 GET/POST 等请求。

示例:GET请求

css 复制代码
resp, err := http.Get("https://httpbin.org/get")
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))

示例:POST请求

go 复制代码
data := url.Values{"name": {"Go"}}
resp, err := http.PostForm("https://httpbin.org/post", data)
defer resp.Body.Close()

六、JSON接口的处理

JSON响应

go 复制代码
func jsonHandler(w http.ResponseWriter, r *http.Request) {
    type Resp struct {
        Status string `json:"status"`
    }
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(Resp{"ok"})
}

JSON请求解析

go 复制代码
func receiveJSON(w http.ResponseWriter, r *http.Request) {
    type Req struct {
        Name string `json:"name"`
    }
    var data Req
    json.NewDecoder(r.Body).Decode(&data)
    fmt.Fprintf(w, "Hello, %s", data.Name)
}

七、静态文件服务

less 复制代码
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("public"))))

访问 /static/index.html 实际读取 public/index.html 文件。


八、HTTP中间件的编写

中间件常用于实现日志、认证、限流等功能。

go 复制代码
func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf("Request: %s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

九、启动HTTPS服务(SSL)

go 复制代码
http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)

用于生产环境时,请使用自动证书工具如 Let's Encrypt + Caddy/Nginx 做代理。


十、总结

能力 工具与API
启动Web服务 http.ListenAndServe
构造REST接口 HandlerFunc + JSON 编解码
发起HTTP请求 http.Get, http.Post, http.Client
路由与中间件 ServeMux 或第三方路由器
文件服务与HTTPS http.FileServer / ListenAndServeTLS
相关推荐
阿杆1 分钟前
垃圾回收不是回收站:JVM GC 背后的爱恨情仇
java·后端·面试
AKAMAI19 分钟前
大数据思考:面对海量数据时,选择哪种模式才是更适合自己的?
后端·云原生·云计算
是紫焅呢28 分钟前
F接口基础.go
开发语言·后端·青少年编程·golang·visual studio code
网安密探29 分钟前
CNAME 记录深度解析
后端
xcLeigh31 分钟前
飞算JavaAI:精准切中开发者痛点,专治“AI生成代码不可用、逻辑混乱”的顽疾
后端
error_cn39 分钟前
helmfile环境变量传递方式
后端
DS小龙哥40 分钟前
基于STM32设计的便携式定位器
后端
武子康42 分钟前
大数据-17 Flume 分布式日志收集 实时采集引擎 Source Channel Sink 串行复制负载均衡
大数据·后端·apache flume
GetcharZp42 分钟前
告别“只闻其名”!一文带你深入浅出 WebRTC,并用 Go 搭建你的第一个实时应用
后端·webrtc
Hesse44 分钟前
Fast DDS v2.8.2 数据流程代码解析
c++·后端