从零开始用Golang创建HTTP服务器
Go语言自带一个健壮、强大且可用于生产的HTTP服务器。而且它非常易于使用,同时又不失灵活性和可配置性,甚至能精确到最微小的细节。
http包包含了一个Server对象,它拥有我们所需的一切。启动它所需的最基本属性是Addr和Handler。
Addr
Addr是服务器将要监听的地址,是一个格式为<ip>:<端口>的字符串。例如,如果我们想接收网络上任何计算机通过8080端口发来的请求,可以设置为:8080或0.0.0.0:8080。如果我们在开发时,可以使用127.0.0.1:8080,这样只有本机才能访问(这在Mac上非常有用,可以避免频繁弹出防火墙提示)。
Handler
Handler是一个函数,每当服务器收到HTTP请求时都会被调用。该函数拥有一个ResponseWriter用于发送响应,以及一个Request用于读取客户端请求。
在接下来的示例中,我们记录HTTP方法和URL的日志,然后返回"Hello World!!"作为响应。
package main
import (
"log"
"net/http"
)
func main() {
s := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println(r.Method, r.URL)
w.Write([]byte("Hello World!!"))
}),
}
err := s.ListenAndServe()
if err != nil {
log.Fatal(err)
}
}
如果服务器启动一切顺利,执行将停在ListenAndServe调用处,因为它是阻塞的,所有到达的HTTP请求都将由我们定义的handler函数处理。
在这个示例中,无论收到的URL是什么,我们总是返回相同的响应。
提供更多页面
要提供更多页面,例如首页和登录页,我们需要手动添加条件判断。
s := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println(r.Method, r.URL)
if r.URL.Path == "/" {
w.Write([]byte("<h1>Inicio</h1>"))
return
}
if r.URL.Path == "/login" {
w.Write([]byte("<h1>Login</h1>"))
return
}
// ...
}),
}
这样,访问http://localhost:8080/login将得到登录页面,访问http://localhost:8080/将得到首页。
你可能已经猜到,这样的代码脆弱且难以维护,但幸运的是,有HTTP路由器(也称为Mux)来帮助我们。
加入我们!
在Discord SeniorGo - Latam上关注项目。
加入GitHub上的项目。
Comentarios