trainingDiary_5

学习go web

写在前面

关于ubuntu fabric框架方面简单测试案例,交给了队友,所以我先来学go web先了。

go web

http包建立Web服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import (
"fmt"
"net/http"
"strings"
"log"
)

func sayhelloName(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["url_long"])
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("val:", strings.Join(v, ""))
}
fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的
}

func main() {
http.HandleFunc("/", sayhelloName) //设置访问的路由
err := http.ListenAndServe(":9090", nil) //设置监听的端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}

go web中要编写一个Web服务器很简单,只要调用http包的两个函数就可以了。

web工作方式概念

以下均是服务器端的几个概念

Request:用户请求的信息,用来解析用户的请求信息,包括post、get、cookie、url等信息
Response:服务器需要反馈给客户端的信息
Conn:用户的每次请求链接
Handler:处理请求和生成返回信息的处理逻辑

http包执行流程

http包执行流程:

创建Listen Socket, 监听指定的端口, 等待客户端请求到来。

Listen Socket接受客户端的请求, 得到Client Socket, 接下来通过Client Socket与客户端通信。

处理客户端的请求, 首先从Client Socket读取HTTP请求的协议头, 如果是POST方法, 还可能要读取客户端提交的数据, 然后交给相应的handler处理请求, handler处理完毕准备好客户端需要的数据, 通过Client Socket写给客户端。

处理器和处理函数

处理器

一个处理器就是一个拥有ServeHTTPf方法的接口

1
ServeHTTP(http.ResponseWriter, *http.Request)

http.Handle可以将处理器绑定至DefaultServeMux

处理器函数

处理器函数是一个具有特定签名的函数,即HandlerFunc。特定签名如下:

1
type HandlerFunc func(ResponseWriter, *Request)

处理器函数只不过是创建处理器的一种便利的方法而已。Go语言拥有一种HandlerFunc函数类型,它可以把一个带有正确签名的函数f(即一个handlerFunc)转换成一个带有f的Handler。http.HandleFunc的内部实现,就是调用HandlerFunc函数来实现的。http.HandleFunc实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
DefaultServeMux.HandleFunc(pattern, handler)
}

func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
mux.Handle(pattern, HandlerFunc(handler))
}
```


#### 多路复用处理函数
这最后的运行结果就是当你输入h1的时候进入第一个,h2第二个,h3第三个
``` go
package main

import (
"fmt"
"net/http"
)

// 设置多个处理器函数
func handler1(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "1 欢迎访问 www.ydook.com !")
}

func handler2(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "2 欢迎访问 www.ydook.com !")
}

func handler3(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "3 欢迎访问 www.ydook.com !")
}

func main() {
// 设置多路复用处理函数
mux := http.NewServeMux()

mux.HandleFunc("/h1", handler1)
mux.HandleFunc("/h2", handler2)
mux.HandleFunc("/h3", handler3)

// 设置服务器
server := &http.Server{
Addr: "127.0.0.1:8000",
Handler: mux,
}

// 设置服务器监听请求端口
server.ListenAndServe()
}