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

简介: Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。

 

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


一、快速创建一个HTTP服务

示例:最简Hello服务

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:用于构造服务器的响应

示例:获取请求信息

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. 获取查询参数

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)

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

四、自定义HTTP路由与Handler

使用 http.ServeMux

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

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

// 示例略,可根据需要引入第三方库

五、构建HTTP客户端请求

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

示例:GET请求

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

示例:POST请求

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

六、JSON接口的处理

JSON响应

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请求解析

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)
}

七、静态文件服务

http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("public"))))

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


八、HTTP中间件的编写

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

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)

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

 

相关文章
|
4月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
384 4
|
6月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
521 0
|
4月前
|
JavaScript 前端开发 Java
【GoWails】Go做桌面应用开发?本篇文章带你上手Wails框架!一步步带你玩明白前后端双端的数据绑定!
wails是一个可以让你使用Go和Web技术编写桌面应用的项目 可以将它看作Go的快并且轻量级的Electron替代品。可以使用Go的功能,并结合现代化UI完成桌面应用程序的开发
914 4
|
8月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
401 14
|
6月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
8月前
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
Ubuntu 网络协议 Unix
02理解网络IO:实现服务与客户端通信
网络IO指客户端与服务端通过网络进行数据收发的过程,常见于微信、QQ等应用。本文详解如何用C语言实现一个支持多客户端连接的TCP服务端,涉及socket编程、线程处理及通信流程,并分析“一消息一线程”模式的优缺点。
411 0
|
Go vr&ar 编解码
golang ffmpeg 做网络直播
最近在公司做在线视频转码的工作,研究了下ffmpeg 最后直接研究了下网络直播,我是在我自己的mac 上面测试的,效果,还可以,先看看效果图吧 ffmpeg 我是通过brew安装 的,这步就略了 VLC这个播放器怎么安装的也略了 我先是在github上面找了一个开源的直播流工具 https://github.
4196 0
|
4月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
276 1
|
6月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
380 1