Go网络编程-HTTP程序设计_2

HTTP程序设计

Go编写HTTP服务器,用 Go实现一个 http server非常容易,Go 语言标准库 net/http自带了一系列结构和方法来帮助开发者简化 HTTP 服务开发的相关流程。因此,我们不需要依赖任何第三方组件就能构建并启动一个高并发的 HTTP 服务器。

简单的HTTP服务器

函数:

复制代码
 // http.ListenAndServe
 func ListenAndServe(addr string, handler Handler) error

用于启动HTTP服务器,监听addr,并使用handler来处理请求。返回启动错误。其中:

  • addr,TCP address,形式为 IP:port,IP省略表示监听全部网络接口

  • handler,经常的被设置为nil,表示使用DefaultServeMux(默认服务复用器)来处理请求。

  • DefaultServeMux要使用以下两个函数来添加请求处理器

    • func Handle(pattern string, handler Handler)

    • func HandleFunc(pattern string, handler func(ResponseWriter, *Request))

示例代码:

httpServerSimple.go

复制代码
 func HttpServerSimple() {
     // 一:设置不同路由(path)对应不同的处理器
     // /ping <-> pong
     http.HandleFunc("/ping", handlePing)
 ​
     // 三:使用http.Handle设置处理器对象
     infoHandler := InfoHandler{
         info: "Welcome to Mashibing Go classroom.",
     }
     http.Handle("/info", infoHandler)
 ​
     // 二:启动监听并提供服务
     addr := ":8088"
     log.Println("http server is listening on ", addr)
     err := http.ListenAndServe(addr, nil)
     log.Fatalln(err)
 }
 ​
 // http.ResponseWriter 响应Writer
 // *http.Request 请求对象,包含了请求信息
 func handlePing(w http.ResponseWriter, r *http.Request) {
     fmt.Fprintf(w, "pong")
 }
 ​
 // InfoHandler 实现Handler接口的类型
 type InfoHandler struct {
     info string
 }
 ​
 func (h InfoHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
     fmt.Fprintf(w, h.info)
 }

其中:Handler 接口的定义为:

复制代码
 type Handler interface {
     ServeHTTP(ResponseWriter, *Request)
 }

我们的 InfoHandler实现了Handler接口,可以作为 http.Handle()的第二个参数来使用。

测试,通过main.main() 启动服务器:

httpServerSimple.go

复制代码
 func main() {
     // 简单的HTTP服务器
     HttpServerSimple()
 }

运行

复制代码
 go run httpServerSimple.go
 2023/03/02 21:00:29 http server is listening on  :8088

请求测试:

复制代码
 curl http://localhost:8088/ping
 pong
 ​
 curl http://localhost:8088/info
 Welcome to Mashibing Go classroom.

复杂的HTTP服务器

定制性的HTTP服务器,通过 Server 类型进行设置。其定义如下:

复制代码
 // net/http
 type Server struct {
     // TCP Address
     Addr string
     Handler Handler // handler to invoke, http.DefaultServeMux if nil
     // LSConfig optionally provides a TLS configuration for use
     // by ServeTLS and ListenAndServeTLS
     TLSConfig *tls.Config
     // 读请求超时时间
     ReadTimeout time.Duration
     // 读请求头超时时间
     ReadHeaderTimeout time.Duration
     // 写响应超时时间
     WriteTimeout time.Duration
     // 空闲超时时间
     IdleTimeout time.Duration
     // Header最大长度
     MaxHeaderBytes int
 ​
     // 其他字段略
 }

该类型的 func (srv *Server) ListenAndServe() error 函数用于监听和服务。

示例代码:

复制代码
 // @file: HttpServerCustom.go
 ​
 func HttpServerCustom() {
     myHandler := CustomHandler{message: "http.Server"}
     s := &http.Server{
         Addr:           ":8080",
         Handler:        myHandler,
         ReadTimeout:    10 * time.Second,
         WriteTimeout:   10 * time.Second,
         MaxHeaderBytes: 1 << 20,
     }
     log.Fatal(s.ListenAndServe())
 }
 ​
 type CustomHandler struct {
     message string
 }
 ​
 func (h CustomHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
     time.Sleep(10 * time.Second)
     fmt.Fprintf(w, h.message)
 }
相关推荐
2501_9160088920 小时前
iOS 26 系统流畅度实战指南|流畅体验检测|滑动顺畅对比
android·macos·ios·小程序·uni-app·cocoa·iphone
小雨青年1 天前
基于 MacOS 的Rokid 开发本地环境搭建指南
macos
YoungHong19921 天前
一行配置解决claude code 2.0版本更新后 vscode 插件需要登录的问题
ide·vscode·编辑器
Blue桃之夭夭1 天前
git和VScode
ide·git·vscode
时光追逐者1 天前
一款由网易出品的免费、低延迟、专业的远程控制软件,支持手机、平板、Mac 、PC、TV 与掌机等多设备远控电脑!
macos·电脑·远程控制工具
二王一个今1 天前
Python打包成exe(windows)或者app(mac)
开发语言·python·macos
一勺菠萝丶1 天前
Mac 上用 Homebrew 安装 JDK 8(适配 zsh 终端)完整教程
java·python·macos
周杰伦_Jay1 天前
【Homebrew安装 MySQL 】macOS 用 Homebrew 安装 MySQL 完整教程
数据库·mysql·macos
小萌新上大分1 天前
Typora 配置 PicGo 使用 Gitee 图床实现图片自动上传(Mac 详细教程)
macos·gitee·typora图床·gitee图床·picgo配置gitee·typora配置图床·typora的图床gitee
林鸿群1 天前
Apple M3 MacOS arm64 编译QGroundControl5.0.8(base on Qt 6.8.3)
macos·ios·qgc·qgroundcontrol