HTTP(HyperText Transfer Protocol):
HTTP是一种应用层协议,它定义了通信双方传送数据的格式和方式。在Go语言中,可以通过内置的http包来构建和处理HTTP请求和响应,让我们更加便捷地开发Web应用程序。本篇笔记会以简单易懂的方式介绍HTTP协议。
洋葱模型:
洋葱模型是一种网络应用程序架构,将请求/响应从外层向内层依次穿过多个中间件处理单元,每层中间件对请求和响应进行处理、记录或重新编排,并在返回时再经过相同的层级进行相同的操作,以达到增强应用可扩展性、可维护性和可测试性的效果。
HTTP协议的结构:
HTTP协议的结构由三部分组成:请求行、请求头和请求体。其中,请求行包含了请求方法、请求URI和协议版本信息;请求头包含了关于客户端、服务器和请求本身的各种信息;请求体则包含了请求上传的数据信息。下面是一个简单的
HTTP请求例子:
GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
上面的HTTP请求表示客户端希望获取服务器上/index.html页面的内容,并且带有一些附加的请求头信息。
Go语言中的HTTP处理:
在Go语言中,可以使用net/http包来编写HTTP服务器和客户端程序。net/http包提供了许多功能强大的函数和接口,以支持HTTP协议的各个方面,包括路由、处理请求和响应等 。
下面是HTTP服务器例子
(别问代码为什么这么奇怪,从goland贴下来不会调markdown个格式...):
go func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
上述代码中,通过http.HandleFunc()函数将一个URL路径与一个处理器函数进行关联。这个函数会在收到GET请求时返回"Hello World!"。 处理路由 路由是Web开发中的重要组成部分,它用来映射URL和执行逻辑代码的关系。在Go语言中,可以用mux库来实现路由功能。
下面是基于mux库实现的HTTP服务器例子:
go func main() {
r := mux.NewRouter()
r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
})
r.HandleFunc("/users/{id}", func(w http.ResponseWriter, r *http.Request) {
var := mux.Vars(r)
id := vars["id"]
fmt.Fprintf(w, "User ID: %s", id)
})
log.Fatal(http.ListenAndServe(":8080", r))
}
个人思考:
我认为HTTP会在高效、低延迟、面向移动设备等特性的解决方案前进。包括使用升级HTTP服务器软件、采用微服务以及通过数据中心网络缩短通信距离等措施,提供更牛的体验。