处理 HTTP 请求
使用 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 ( "io" "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 这两个文件,运行结果如下:

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/21369.html