全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何在Golang中使用net/http创建HTTP服务器_处理路由和响应

Go 中用 net/http 创建 HTTP 服务器无需第三方框架,核心是 http.ServeMux 和 Handler;支持默认多路复用器、自定义路由、方法判断、JSON 响应、参数解析及日志/恢复中间件。

在 Go 中用 net/http 创建 HTTP 服务器非常简洁,不需要第三方框架也能轻松处理路由和响应。核心在于理解 http.ServeMux(多路复用器)的作用,以及如何通过 http.HandleFunc 或自定义 http.Handler 来分发请求。

基础 HTTP 服务器:监听与响应

最简服务只需几行代码:

启动一个监听 8080 端口的服务器,对根路径 / 返回纯文本响应:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello, World!")
    })
    fmt.Println("Server starting on :8080")
    http.ListenAndServe(":8080", nil)
}

这里 nil 表示使用默认的 http.DefaultServeMux,它负责把请求路径映射到对应的处理函数。

手动管理路由:使用自定义 ServeMux

显式创建 http.ServeMux 更清晰,也便于测试和复用:

  • 避免污染全局默认多路复用器
  • 可为不同子服务配置独立路由树
  • 方便注入中间件或统一日志

示例:

func main() {
    mux := http.NewServeMux()
    
    mux.HandleFunc("/api/users", func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json")
        fmt.Fprint(w, `{"users":[]}`)
    })
    
    mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        fmt.Fprint(w, "OK")
    })

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

支持不同 HTTP 方法:检查 r.Method

net/http 不直接按方法(GET/POST/PUT)自动路由,需在 handler 内判断:

mux.HandleFunc("/posts", func(w http.ResponseWriter, r *http.Request) {
    switch r.Method {
    case "GET":
        // 返回文章列表
        w.Header().Set("Content-Type", "application/json")
        fmt.Fprint(w, `[{"id":1,"title":"Go入门"}]`)
    case "POST":
        // 创建新文章
        w.WriteHeader(http.StatusCreated)
        fmt.Fprint(w, `{"id":2,"title":"新文章"}`)
    default:
        http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
    }
})

注意:确保返回正确状态码和响应头,尤其是 JSON 接口要设 Content-Type: application/json

返回结构化数据:JSON 响应

json.Marshal 序列化结构体,并设置响应头:

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

mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) {
    user := User{ID: 123, Name: "Alice"}
    
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(user) // 自动调用 Marshal,更安全
})

推荐用 json.NewEncoder(w).Encode() 替代 json.Marshal() + fmt.Fprint,它能流式写入、避免内存拷贝,且自动处理错误(如编码失败时写入空响应)。

处理 URL 参数和表单数据

查询参数(?key=value):r.URL.Query().Get("page")
路径参数(需手动解析,如 /user/123):strings.Split(r.URL.Path, "/") 或正则提取
表单数据(POST 表单或 x-www-form-urlencoded):r.ParseForm() 后读 r.FormValue("username")
JSON 请求体:io.ReadAll(r.Body) 读取原始字节,再 json.Unmarshal

示例(读取 JSON 请求体):

mux.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) {
    if r.Method != "POST" {
        http.Error(w, "POST required", http.StatusMethodNotAllowed)
        return
    }

    var req struct {
        Username string `json:"username"`
        Password string `json:"password"`
    }
    if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
        http.Error(w, "Invalid JSON", http.StatusBadRequest)
        return
    }

    // 验证逻辑...
    w.Header().Set("Content-Type", "application/json")
    fmt.Fprint(w, `{"success":true}`)
})

添加简单中间件:日志与恢复

通过包装 handler 实现通用逻辑:

func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Printf("→ %s %s\n", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

func recoverMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        defer func() {
            if err := recover(); err != nil {
                http.Error(w, "Internal error", http.StatusInternalServerError)
                fmt.Printf("Panic: %v\n", err)
            }
        }()
        next.ServeHTTP(w, r)
    })
}

// 使用:
mux := http.NewServeMux()
mux.HandleFunc("/api/", apiHandler)
http.ListenAndServe(":8080", recoverMiddleware(loggingMiddleware(mux)))

注意中间件顺序:越靠外的越先执行(如日志在 recover 外层,就能记录 panic 前的请求)。


# word  # js  # json  # go  # golang  # 编码  # app  # 字节  # 端口  # usb  # ai  # switch  # 路由  # 状态码  # red  # 中间件  # 结构体  # 接口  # nil  # http  # 自定义  # 表单  # 多路  # 第三方  # 复用器  # 尤其是  # 就能  # 不需要  # 也能  # 只需 


相关文章: 常州自助建站工具推荐:低成本搭建与模板选择技巧  宁波自助建站系统如何快速打造专业企业网站?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  建站之星如何实现五合一智能建站与营销推广?  如何在景安云服务器上绑定域名并配置虚拟主机?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  已有域名能否直接搭建网站?  如何彻底删除建站之星生成的Banner?  如何通过虚拟主机快速搭建个人网站?  制作网站的模板软件,网站怎么建设?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  北京制作网站的公司,北京铁路集团官方网站?  建站之星后台密码遗忘如何找回?  微信推文制作网站有哪些,怎么做微信推文,急?  建设网站制作价格,怎样建立自己的公司网站?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  湖北网站制作公司有哪些,湖北清能集团官网?  如何在企业微信快速生成手机电脑官网?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  已有域名如何免费搭建网站?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  建站之星北京办公室:智能建站系统与小程序生成方案解析  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  广州建站公司哪家好?十大优质服务商推荐  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  简历在线制作网站免费版,如何创建个人简历?  如何快速使用云服务器搭建个人网站?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  如何零基础在云服务器搭建WordPress站点?  行程制作网站有哪些,第三方机票电子行程单怎么开?  制作网页的网站有哪些,电脑上怎么做网页?  建站之星后台密码如何安全设置与找回?  建站主机CVM配置优化、SEO策略与性能提升指南  如何在建站之星绑定自定义域名?  如何通过免费商城建站系统源码自定义网站主题与功能?  如何高效搭建专业期货交易平台网站?  建站主机无法访问?如何排查域名与服务器问题  如何通过山东自助建站平台快速注册域名?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  广州商城建站系统开发成本与周期如何控制?  定制建站哪家更专业可靠?推荐榜单揭晓 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。