这一期我们讲一讲如何使用 Go 语言搭一个最简单的 Web 服务器。

在 Go 语言中,有一个 net/http 的包,使用该包我们就能方便的搭建起一个 Web 服务,下面是一个最最简单的例子,相信你不用花上 1 分钟就能写出来:

package main

import (
"fmt"
"log"
"net/http"
)

func printHello(w http.ResponseWriter, r *http.Request) {
// 写入变量 w 输出到客户端的信息
fmt.Fprintf(w, "Hello Go Web")
}

func main() {
// 设置路由
http.HandleFunc("/", printHello)
// 设置监听端口
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe:", err)
}
}

好了,代码就是这些,很少吧,运行一下,这个时候已经开始在 ​​8080​​ 端口监听 HTTP 链接的请求了。我们打开浏览器,输入:

http://localhost:8080

或者

http://127.0.0.1:8080/

你就会看到网页上输出了 ​​Hello Go Web​​ 字样。怎么样,简单吧?

在 Go 中,HTTP 通信时客户端请求信息封装在 ​​http.Request​​​ 对象中,而服务器返回的响应报文会保存在 ​​http.Response​​​ 结构体中,发送给客户端响应的不是 ​​http.Response​​​ ,而是通过 ​​http.ResponseWriter​​ 接口来实现的。

// A ResponseWriter interface is used by an HTTP handler to
// construct an HTTP response.
//
// A ResponseWriter may not be used after the Handler.ServeHTTP method
// has returned.
type ResponseWriter interface {
Header() Header
Write([]byte) (int, error)
WriteHeader(statusCode int)
}

上面的例子中我们定义了 ​​printHello()​​ 函数,将 Hello Go Web 这个响应信息写入到 ​​http.ResponseWriter​​​ 中,在 ​​main​​​ 函数中,我们调用 ​​http.HandleFunc()​​​ 设置路由,绑定其响应的函数,并调用 ​​http.ListenAndServe()​​ 设置监听窗口,从而实现对相应端口 HTTP 请求的响应。

当然,这里我们没有考虑异常的情况,这些后续再讲。

这里我们也可以对请求的参数进行解析,下面的例子使用 ​​ParseForm()​​ 方法对请求的参数进行解析,然后我们将相应的信息输出到控制台:

package main

import (
"fmt"
"log"
"net/http"
"strings"
)

func printHello(w http.ResponseWriter, r *http.Request) {
// 解析参数(默认不解析)
r.ParseForm()
// 下面输出到服务器端的信息
fmt.Println(r.Form)
fmt.Println("path", r.URL.Path)
fmt.Println("scheme", r.URL.Scheme)
fmt.Println(r.Form["args"])
for k, v := range r.Form {
fmt.Println("key: ", k)
fmt.Println("val: ", strings.Join(v, ""))
}
// 写入变量 w 输出到客户端的信息
fmt.Fprintf(w, "Hello Go Web")
}

func main() {
// 设置路由
http.HandleFunc("/", printHello)
// 设置监听端口
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe:", err)
}
}

这里,运行该程序后我们访问

http://127.0.0.1:8080/?args=1

控制台会输出如下:

map[args:[1]]
path /
scheme
[1]
key: args
val: 1
map[]
path /favicon.ico
scheme
[]

可以看到,在我们带了 ​​args​​ 参数后,会在控制台打印出请求的解析结果。