golang http怎么使用


本文摘自php中文网,作者(*-*)浩,侵删。

都说go标准库实用,Api设计简洁。这次就用go 标准库中的net/http包实现一个简洁的http web服务器,包括三种版本。

最简单版 (推荐学习:go)

直接使用

1

http.HandleFunc(partern,function(http.ResponseWriter,*http.Request){})

HandleFunc接受两个参数,第一个为路由地址,第二个为处理方法。

1

2

3

4

5

6

7

8

9

10

11

12

13

//v1

func main() {

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

         w.Write([]byte("httpserver v1"))

       })

       http.HandleFunc("/bye", sayBye)

       log.Println("Starting v1 server ...")

       log.Fatal(http.ListenAndServe(":1210", nil))

 }

 

func sayBye(w http.ResponseWriter, r *http.Request) {

      w.Write([]byte("bye bye ,this is v1 httpServer"))

}

自定义Handler

查看标准库源码,v1版本实际上是调用了handle方法,传入的HandlerFunc实现了Handler的ServeHTTP方法,实际上是ServeHTTP在做http请求处理。

go-2.png

go-3.png

go-4.png

由此我们可以自定义自己的Handler,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

// v2

func main() {

   mux := http.NewServeMux()

   mux.Handle("/", &myHandler{})

   mux.HandleFunc("/bye", sayBye)

 

   log.Println("Starting v2 httpserver")

   log.Fatal(http.ListenAndServe(":1210", mux))

}

type myHandler struct{}

 

func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {

      w.Write([]byte("this is version 2"))

}

func sayBye(w http.ResponseWriter, r *http.Request) {

     w.Write([]byte("bye bye ,this is v2 httpServer"))

}

自定义server配置

前面对Handler开了一次刀,下面我们看看http.ListenAndServe()中有些什么秘密。

go-5.png

原来这里可以自定义http服务器配置,都在Server这个结构体中,这个对象能配置监听地址端口,配置读写超时时间,配置handler,配置请求头最大字节数...,所有稍微改造一下上一个的程序得到现在的程序:

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

// v3

func main() {

    mux := http.NewServeMux()

    mux.Handle("/", &myHandler{})

    mux.HandleFunc("/bye", sayBye)

 

    server := &http.Server{

        Addr:         ":1210",

        WriteTimeout: time.Second * 3,            //设置3秒的写超时

        Handler:      mux,

    }

    log.Println("Starting v3 httpserver")

    log.Fatal(server.ListenAndServe())

}

 

type myHandler struct{}

 

func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {

    w.Write([]byte("this is version 3"))

}

 

func sayBye(w http.ResponseWriter, r *http.Request) {

       // 睡眠4秒  上面配置了3秒写超时,所以访问 “/bye“路由会出现没有响应的现象

    time.Sleep(4 * time.Second)             

    w.Write([]byte("bye bye ,this is v3 httpServer"))

}

以上就是golang http怎么使用的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

手撸golang 行为型设计模式 命令模式

golang不能发送udp广播

golang的优势是什么

golang channel有什么好处

杂七杂八的一些备忘

golang语言学习之基本语法

【译文】go 高级并发

研究数组

golang中fscanf读取文件时把回车替换成0

手撸golang 基本数据结构与算法 快速排序

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...