Go语言服务端处理HTTP、HTTPS请求
使用 net/http 包提供的 http.ListenAndServe() 方法,可以对指定的地址进行监听,开启一个 HTTP,服务端该方法的原型如下:
func ListenAndServe(addr string, handler Handler) error
该方法用于在指定的 TCP 网络地址 addr 进行监听,然后调用服务端处理程序来处理传入的连接请求。
ListenAndServe 方法有两个参数,其中第一个参数 addr 即监听地址,第二个参数表示服务端处理程序,通常为空。第二个参数为空时,意味着服务端调用 http.DefaultServeMux 进行处理,而服务端编写的业务逻辑处理程序 http.Handle() 或 http.HandleFunc() 默认注入 http.DefaultServeMux 中,代码如下所示:
http.Handle( /foo , fooHandler) http.HandleFunc( /bar , func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, Hello, %q , html.EscapeString(r.URL.Path)) log.Fatal(http.ListenAndServe( :8080 , nil))
如果想更多地控制服务端的行为,可以自定义 http.Server,代码如下所示:
s := http.Server{ Addr: :8080 , Handler: myHandler, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, MaxHeaderBytes: 1 20, log.Fatal(s.ListenAndServe())
下面通过一个简单的服务端示例来演示一下Go语言是如何处理 HTTP 请求的,代码如下所示:
package main import ( log net/http func HelloServer(w http.ResponseWriter, req *http.Request) { io.WriteString(w, C语言中文网/n ) func main() { http.HandleFunc( /hello , HelloServer) err := http.ListenAndServe( :12345 , nil) if err != nil { log.Fatal( ListenAndServe: , err) }
成功运行上面的代码会占用 12345 端口,我们可以使用浏览器访问http://localhost:12345/hello来查看运行结果,如下所示:
处理 HTTPS 请求net/http 包还提供 http.ListenAndServeTLS() 方法,用于处理 HTTPS 连接请求:
func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) error
ListenAndServeTLS 函数和 ListenAndServe 函数的行为基本一致,区别在于 ListenAndServeTLS 函数只处理 HTTPS 请求。
此外,服务器上必须提供证书文件和对应的私钥文件,比如 certFile 对应 SSL 证书文件存放路径,keyFile 对应证书私钥文件路径。如果证书是由权威机构签发的,certFile 参数指定的路径必须是存放在服务器上的经由 CA 认证过的 SSL 证书。
开启 SSL 监听服务也很简单,如下列代码所示:
http.Handle( /foo , fooHandler) http.HandleFunc( /bar , func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, Hello, %q , html.EscapeString(r.URL.Path)) log.Fatal(http.ListenAndServeTLS( :10443 , cert.pem , key.pem , nil))
或者是:
ss := http.Server{ Addr: :10443 , Handler: myHandler, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, MaxHeaderBytes: 1 20, log.Fatal(ss.ListenAndServeTLS( cert.pem , key.pem ))
下面通过示例来演示一下Go语言时如何处理 HTTPS 请求的,代码如下所示:
package main import ( log net/http func handler(w http.ResponseWriter, req *http.Request) { w.Header().Set( Content-Type , text/plain ) w.Write([]byte( C语言中文网/n )) func main() { http.HandleFunc( / , handler) log.Printf( 监听 1234 端口成功,可以通过 https://127.0.0.1:1234/ 访问 ) err := http.ListenAndServeTLS( :1234 , cert.pem , key.pem , nil) if err != nil { log.Fatal(err) }
运行上面的程序需要用到 cert.pem 和 key.pem 这两个文件,可以使用 crypto/tls 包的 generate_cert.go 文件来生成 cert.pem 和 key.pem 这两个文件,运行结果如下:
21369.html
C语言gohtml相关文章
- Go切片与技巧(附图解)
- 19.Go语言-make和new
- 23.Go语言-结构体里的Tag标签
- Go语言之Golang http请求库HttpRequest[通俗易懂]
- Go中struct初始化内存布局情况
- Go HTTP 编程 | 01 - 使用 http 包创建 Web 服务器
- 照猫画虎把SpringBoot搬到K8s,居然翻船咧,体验到了Go在云原生的两个优势
- 基于 Go 语言开发的监控系统
- 开心档之Go 语言数据类型
- 非常好用的爬虫语言Go
- Go-RESTful-设计API接口(二)
- Go语言range关键字:循环迭代切片
- Go语言for(循环结构)
- Go语言Test功能测试函数详解
- Go语言go mod包依赖管理工具使用详解
- Go从入门到精通(一)go语言初识详解编程语言
- Go语言圣经–作用域,基础数据类型,整型详解编程语言
- 使用Go语言来操作Oracle数据库(go语言oracle)
- go语言之数组详解编程语言
- 精通Go语言开发Redis应用(go语言redis开发)
- Go语言在Linux上的编译实践(golinux编译)
- 程序Linux上运行Go语言程序的指南(linux运行go)
- 简易教程:如何在 Linux 上安装 GO 语言(go语言安装linux)
- Go语言环境配置:在 Linux 下实现(go环境搭建linux)
- 用Go语言深入Redis缓存技术(用go写redis)
- 数据库探索Go语言与Oracle数据库的结合(go语言中的oracle)
- 新技术Go语言解析Oracle数据库日志(go解析oracle日志)
- 前行不止Go语言监听Oracle日志(go监听oracle日志)
- 数据库Go语言实现监控Oracle数据库(go监听oracle)
- 数据库Go语言连接Oracle数据库的指南(go如何连接oracle)
- Go语言helloworld实例
- GO语言数组和切片实例详解