首页 > Go语言 > Go语言网络编程 阅读:3,982

Go语言服务端处理HTTP、HTTPS请求

本节我们主要来介绍一下使用Go语言编写的 HTTP 服务端是如何处理 HTTP 和 HTTPS 请求的。

处理 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 这两个文件,运行结果如下:

爱面试的程序媛,一个分享面试经验的公众号。跟着站长一起学习,每天都有进步。

通俗易懂,深入浅出,定时分享程序员面试的那点事。

面试如何造火箭?工作如何拧螺丝?都在这个公号哦。

扫描二维码关注公众号,免费领取价值 1000 元的求职面试资料(限时免费)!

当你决定关注「爱面试的程序媛」,你已然超越了90%的程序员!

爱面试的程序媛二维码
微信扫描二维码关注