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
相关推荐
Java水解4 分钟前
SpringMVC入门:配置、映射与参数处理
后端·spring
李拾叁的摸鱼日常4 分钟前
Spring Security 6.5.x 中用户名密码登录校验流程
后端
紫穹22 分钟前
009.LangChain 手动记忆全流程
后端·ai编程
勇者无畏40428 分钟前
基于 Spring AI Alibaba 搭建 Text-To-SQL 智能系统(前置介绍)
java·后端·spring·prompt·embedding
AronTing38 分钟前
2025阿里P6 Java后端面试全攻略:八大模块深度解析
后端·面试
用户68545375977691 小时前
📈 提升系统吞吐量实战:从1000到10万QPS的飞跃!
后端
helloworld_工程师1 小时前
Dubbo应用开发之FST序列化的使用
后端·dubbo
LucianaiB2 小时前
【程序员副业指南】KwaiKAT AI制作小红薯📕卡片MCP
后端
IT_陈寒2 小时前
Redis性能翻倍的5个冷门优化技巧,90%的开发者都不知道第3个!
前端·人工智能·后端
阿琦学代码3 小时前
Spring Cloud(微服务) 概述
后端·spring·spring cloud