搭一个最简单的 Go Web 服务器
原创
©著作权归作者所有:来自51CTO博客作者菜籽爱编程的原创作品,请联系作者获取转载授权,否则将追究法律责任
这一期我们讲一讲如何使用 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 链接的请求了。我们打开浏览器,输入:
或者
你就会看到网页上输出了 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
参数后,会在控制台打印出请求的解析结果。