go 的HTTP请求处理

devtools/2024/12/22 3:00:57/
http://www.w3.org/2000/svg" style="display: none;">

使用 Go 处理 HTTP 请求主要涉及两件事:ServeMuxesHandlers

  • ServeMux本质上是一个 HTTP 请求路由器(或多路复用器)。它将传入的请求与预定义的 URL 路径列表进行比较,并在找到匹配时调用路径的关联 handler。
  • handler 负责写入响应头和响应体。几乎任何对象都可以是 handler,只要它满足http.Handler接口即可。

必须实现ServeHTTP方法:ServeHTTP(http.ResponseWriter, *http.Request)

package mainimport ("log""net/http"
)func main() {mux := http.NewServeMux()rh := http.RedirectHandler("http://example.org", 307)mux.Handle("/foo", rh)log.Println("Listening...")http.ListenAndServe(":3000", mux)
}
  • 在main函数中,我们使用http.NewServeMux函数创建了一个空的ServeMux。
    然后我们使用http.RedirectHandler函数创建一个新的handler。
  • 该handler将其接收的所有请求307重定向到http://example.org。
  • 接下来我们使用mux.Handle函数向我们的新ServeMux注册它,因此它充当URL路径/foo的所有传入请求的handler。
  • 最后,我们创建一个新服务并使用http.ListenAndServe函数开始监听传入的请求,并传入ServeMux给这个方法以匹配请求。
$ go run main.go
Listening...

自定义 handler

我们创建一个自定义 handler,它以当前本地时间的指定格式响应:

type timeHandler struct {format string
}func (th *timeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {tm := time.Now().Format(th.format)w.Write([]byte("The time is: " + tm))
}

该示例中它是一个timeHandler结构,它同样可以是一个字符串或函数或其他任何东西),并且我们已经实现了一个带有签名ServeHTTP(http.ResponseWriter, *http.Request)的方法。这就是我们实现一个 handler 所需的全部内容。

普通函数作为 handler

对于简单的情况,定义新的自定义类型和 ServeHTTP 方法感觉有点啰嗦。让我们看看另一个方法,我们利用 Go 的http.HandlerFunc类型来使正常的函数满足 Handler 接口。
任何具有签名func(http.ResponseWriter, *http.Request)的函数都可以转换为 HandlerFunc 类型。这很有用,因为 HandleFunc 对象带有一个内置的ServeHTTP方法 - 这非常巧妙且方便 - 执行原始函数的内容。

package mainimport ("log""net/http""time"
)func timeHandler(w http.ResponseWriter, r *http.Request) {tm := time.Now().Format(time.RFC1123)w.Write([]byte("The time is: " + tm))
}func main() {mux := http.NewServeMux()// Convert the timeHandler function to a HandlerFunc typeth := http.HandlerFunc(timeHandler)// And add it to the ServeMuxmux.Handle("/time", th)log.Println("Listening...")http.ListenAndServe(":3000", mux)
}

将函数转换为HandlerFunc类型,然后将其添加到ServeMux的情况比较常见,Go提供了一个快捷的转换方法:mux.HandleFunc方法。

如果我们使用这个转换方法,main()函数将是这个样子:

func main() {mux := http.NewServeMux()mux.HandleFunc("/time", timeHandler)log.Println("Listening...")http.ListenAndServe(":3000", mux)
}

http://www.ppmy.cn/devtools/59295.html

相关文章

汇昌联信电商做拼多多运营如何提高效率?

汇昌联信电商做拼多多运营如何提高效率?在电商领域,效率的高低往往直接关系到企业的成败。拼多多作为国内领先的电商平台之一,吸引了大量商家入驻,竞争异常激烈。对于汇昌联信电商而言,提高在拼多多平台的运营效率,不…

记录|C#连接PLC通讯

参考视频C#连接S71200PLC 参考资料 目录 前言一、使用工具二、博图PLC1.创建好PLC设备Step1. 创建新设备Step2. 自动配置CPUStep3. 配置IP协议和连接机制隐藏步骤:重置解决PLC硬件版本和PLCSim创建的PLC版本不兼容Step4. 通过HslDemo来测试是否连通Step5. 配置DB数据…

【网络安全】APDCL:IDOR + 账户接管

未经许可,不得转载。 文章目录 正文漏洞1:IDOR漏洞2:账户接管 正文 APDCL ,即印度阿萨姆邦电力分销公司(Assam Power Distribution Company Limited),是印度阿萨姆邦政府控制的公共部门企业&am…

Java中HashMap详解:hash原理、扩容机制、线程不安全及源码分析

前言 HashMap 是 Java 中常用的数据结构之一,用于存储键值对。在 HashMap 中,每个键都映射到一个唯一的值,可以通过键来快速访问对应的值,算法时间复杂度可以达到 O(1)。 HashMap 的实现原理是基于哈希表的,它的底层是…

Spring MVC入门2

Postman的使用 接上期我们抛出了一个问题,Postman的使用 可以点击链接下载 https://www.postman.com/downloads/ 安装之后会提示版本升级,直接点击dissmiss即可。 要想发送数据,具体歩奏如下简图: 还有一个更具体的图&#xff…

MySQL-日志-优化

目录 介绍一下mysql 的日志 redo log 和binlog 的区别及应用场景 redo log 和 binlog 在恢复数据库有什么区别? redo log 是怎么实现持久化的? redo log除了崩溃恢复还有什么其他作用? (顺序写) redo log 怎么刷入磁盘的知道吗? 两阶…

C++的缺省参数、函数重载和引用

缺省参数 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参 则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把 缺省参数也叫默认参数),要注意的是…

Anthropic发布新工具改进大语言模型;商汤科技发布全球首个支持泰文的AI大模型

🦉 AI新闻 🚀 Anthropic发布新工具改进大语言模型 摘要:Anthropic 公司推出多项基于 Claude 3.5 Sonnet 大语言模型的新工具,提升提示词生成和测试能力。新增的“评估”单元帮助开发者自动化生成和微调提示,改进任务…