计划写一个讲 Go Web 编程的系列文章。从基于 net/http 包编写 Go Web 程序开始,讲述处理器,请求,响应等基础知识。而后到框架的使用。中间会穿插一些源码的分析。最后作一个实战项目。html
目前 Go 社区已经有很是多关于 Web 开发的库或框架。大而全的有beego,revel。超高性能的有echo,fasthttp,gin(目前 GitHub 星标最多)。还有很多专一于具体某个方面的,最多要属路由了,例如:mux/httprouter。git
那为何还要从最原始的 net/http 包开始学起?由于这些库/框架大可能是基于 net/http 包作了包装,提供易于使用的功能,如路由参数(/:name/:age
)/路由分组等。熟练掌握了基础知识和 net/http,学习其余框架必然能有事半功倍的效果。不论是快速上手使用库和框架,仍是深刻阅读源码,都能驾轻就熟。github
HTTP 协议是整个互联网的基石。无论技术,产品仍是运营,甚至是非互联网行业的人,天天都在与 HTTP 协议打交道。咱们天天浏览网页都在使用 HTTP。如今不少 APP 也都在内部使用 HTTP 与服务器交互。因此学习 Web 编程,HTTP 协议是必需要掌握的。golang
HTTP 是一个无状态的,基于文本的协议。它灵活,稳定,强大。自 1991 年发布以来只进行了几回修订。下面是 HTTP 发展简史:web
HTTP 是一种请求——响应模式的协议,全部操做以一个请求开始,以一个响应结束。编程
HTTP 请求的格式很是简单。一个请求由如下 4 个部分组成:浏览器
第一个重要的部分为请求行,其格式以下:服务器
Method Path Version
Method
:请求的方法,表示对资源进行的操做。经常使用的方法有GET/POST/PUT/DELETE
;Path
:请求资源的路径,如/user/info.html
;Version
:即 HTTP 的版本号,1.1 版本写作HTTP/1.1
。第二个部分为请求的首部,每一个首部占一行。首部使用由冒号(:
)分隔的键值对表示,如Content-Type: x-www-form-urlencoded
。框架
第三个部分为一个空行。注意,即便没有首部,后面的空行也不能省略。socket
最后为一个可选的报文主体。若是有主体,服务器会根据首部中Content-Type
指定的格式来解析这部份内容。
HTTP 响应的格式与请求很是类似。一个响应由如下 4 个部分组成:
响应行的格式为:
StatusCode Description
StatusCode
:状态码,表示请求状态;Description
:对状态码的简短描述。响应的首部与主体和请求的同样,这里就很少说了。
这里简单介绍一下状态码。HTTP 将状态码分为了 5 大类,1XX/2XX/3XX/4XX/5XX
。
1XX
:情报状态码,又叫作信息状态码。服务器经过这类状态码告知客户端,本身已经收到了客户端发送的请求。几个常见的状态码以下:
100 Continue
:表示服务器到目前为止收到的内容都正常,客户端应该继续请求。若是已经完成,则忽略它。101 Switching Protocol
:这个状态码是响应客户端的Upgrade
首部发送的,而且指示服务器也正在切换的协议。如客户端请求切换协议,服务器将协议切换至 Websocket,就会发送该状态码给客户端,而且在Upgrade
首部中填上 Websocket。2XX
:成功状态码。表示服务器已经收到了客户端的请求,并成功对请求进行了处理。几个常见的状态码以下:
200 OK
:这最多见的状态码了,表示请求成功。201 Created
:请求已成功,并所以建立了一个新的资源。3XX
:重定向状态码。服务器收到了请求,可是为了完整地处理该请求,客户端还须要执行指定的动做。通常用于 URL 重定向。几个常见的状态码以下:
300 Multiple Choice
:被请求的资源有一系列可供选择的回馈信息,每一个都有本身特定的地址。用户或浏览器可自行选择一个地址进行重定向。302 Moved Permanently
:被请求的资源已经永久移动到新的位置了。4XX
:客户端错误状态码。表示客户端发送的请求中有错误,如格式不对。常见的状态码以下:
404 Not Found
:最多见的状态码了,表示页面不存在。405 Method Not Allowed
:请求的方法不容许。5XX
:服务器错误状态码。表示服务器因为某些缘由没法正确处理请求。常见的状态码以下:
500 Internal Server Error
:服务器遇到了不知道如何处理的状况。501 Not Implemented
:此请求方法不被服务器支持。Talk is cheap, show me the Code!
接下来,咱们来编写一个 Web 版本的 "Hello World" 程序。咱们将使用 Go 语言提供的 net/http 包。该包的功能十分强大,使用起来也很是方便。
$GOPATH
目录下建立一个项目目录go-web-example
;go-web-example
目录下建立一个1-hello_world
程序目录;server.go
文件,输入下面内容:package main import ( "fmt" "log" "net/http" ) func hello(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World") } func main() { http.HandleFunc("/", hello) if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } }
$GOPATH/go-web-example/1-hello_world
目录,输入命令:go run server.go
,咱们的第一个服务器程序就跑起来了。localhost:8080
,"Hello, World"就在网页上显示出来了!咱们来解析一下该程序。
http.HandleFunc
将hello
函数注册到根路径/
上,hello
函数咱们也叫作处理器。它接收两个参数,第一个参数为一个类型为http.ResponseWriter
的接口,响应就是经过它发送给客户端的。第二个参数是一个类型为http.Request
的结构指针,客户端发送的信息均可以经过这个结构获取。
而后,http.ListenAndServe
将在 8080 端口上监听请求,而后交由hello
处理。
因为 net/http 包为咱们封装了不少细节,因此咱们的使用如此简单。
本文简单介绍了 HTTP 的发展简史、HTTP 请求和响应的格式,而且编写了第一个 Go Web 程序。做为整个互联网的基石,HTTP 协议的重要性怎么形容都不为过,是每一个开发人员都必须掌握的知识。Go 语言的 net/http 为 Web 程序的开发封装了不少细节。使用它来开发 Web 程序很是简单。最后,为了能加深学习的印象,我画了一个脑图。指望学完以后能造成一个完整的知识体系。
接下来,咱们来深刻学习 HTTP 请求的内容。