在Go中,搭建一个http server简单到令人难以置信。只需要引入net/http包,写几行代码,一个http服务器就可以正常运行并接受访问请求。因此,在正式开启项目开发之前,先来看一段简短的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"fmt"
"net/http"
)

func handlerFunc(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "<h1>Hello, 这里是 goblog</h1>")
}
func main() {
http.HandleFunc("/", handlerFunc)
http.ListenAndServe(":3000", nil)
}

很显然,这段代码就能够构成一个Web程序,其中最为主要的内容基本上都与一个包有关—— net/http,那就先学习一下有关这个包的内容吧。

初识net/http

在net/http源代码中,我们可以深深体会到Go语言的结构体(以及自定义类型)、接口、方法简单组合的设计哲学。这个包最主要的文件有4个,分别是: client.go server.go request.go response.go

这四个文件也分别代表了HTTP中最重要的4个部分,http Request 请求、 http Response 响应、http Client客户端和http Server 服务端,所以我们先从这四个方面来了解net/http包:

Request

http Request请求是由客户端发出的消息, 用来使服务器执行动作.发出的消息包括起始行, Headers, Body。

一般使用 http.NewRequest来构造一个http Request请求,可能包括http Headers信息,cookies信息等,然后发给服务端。

Response

http Response响应是由http Server服务端发出的消息,用来响应http Client端发出的http Request请求。发出的消息包括起始行, Headers, Body。

Client

http Client客户端主要用来发送http Request请求给http Server服务端,比如以Do方法,Get方法以及PostPostForm方法发送http Request请求。

http.NewRequest可以灵活的对http Request进行配置,然后再使用http.ClientDo方法发送这个http Request请求。

  • 如果使用Post或者PostForm方法,是不能使用http.NewRequest配置请求的,只有Do方法可以定制http.NewRequest

Server

http Server服务端用来接收并响应http Client端发出的http Request请求,是net/http包中非常重要和关键的一个功能。我们在Go语言中简单就能搭建HTTP服务器,就是因为它的存在。

关于以上四部分的详细内容,可以看这篇文章,里面有更加详细的函数解释。

程序分析

大概了解关于net/http 包之后,我们再回头看开篇的那段代码,或许已经能看懂个大概了。

http.ListenAndServe

http.ListenAndServe 用以监听本地 3000 端口以提供服务,标准的 HTTP 端口是 80 端口,如 baidu.com:80,另一个 Web 常用是 HTTPS 的 443 端口,如 baidu.com:443

当我们监听本地端口时,可使用 localhost 加上端口号来访问。运行上面的程序,可以通过localhost:3000/ 进行访问。

http.HandleFunc

http.HandleFunc 用以指定处理 HTTP 请求的函数,此函数允许我们只写一个 handler,请求会通过参数传递进来,使用者只需与 http.Requesthttp.ResponseWriter 两个对象交互即可。

在实例代码中,我们利用 fmt.Fprint<h1>Hello, 这里是 goblog</h1> 子串写入 http.ResponseWriter,即可响应用户请求。

http.Request

http.Request 是用户的请求信息,一般用 r 作为简写。

一些常见的操作如:

  • r.URL.Query() 获取用户参数
  • 获取客户端信息 r.Header.Get("User-Agent")

http.ResponseWriter

http.ResponseWriter 是返回用户的响应,一般用 w 作为简写。

常见操作如:

  • 返回 500 状态码 w.WriteHeader(http.StatusInternalServerError)
  • 设置返回标头 w.Header().Set("name", "my name is smallsoup")

总结

至此,关于Web程序我们就完成了简单的了解。我们通过http.ListenAndServe来对本地的端口进行监听,等待用户的操作。使用http.HandleFunc来完成当用户做出指定操作时的动作。handlerFunc函数则是我们自己定义的一系列动作,等待HandleFunc调用。