美文网首页
Go web server开发学习1

Go web server开发学习1

作者: 小Q逛逛 | 来源:发表于2016-07-26 09:22 被阅读172次

net/http 包

如果想使用Go建立一个web程序和web APIs,或者建立一个简单的HTTP服务器,最重要的就是标准库的net/http包,提供了web应用的全部基础组件.当然我们也可以进行拓展,开发出自己的框架.目前有beego,revel,martini.对于web开发,net/http,html/template是最主要的包,使用这两个基础的包,就能开发出全部功能的web应用.

net/http包有两个主要的组件:ServeMux(路由),Handler(句柄)

ServeMux

ServeMux 多路复用器(HTTP请求路由),对应着客户端的每个请求,从而调用请求的相应的handler.

Handler

Handlers主要是响应请求,对响应头和主体写入数据(就是服务器对一个客户端过来的一个请求进行相应的操作,比如输出信息给客户端,找不到对应的服务等).在Go,任何的对象都可以作为一个handler,这得益于Go语言的出色的面向接口思想.任意的对象(struct,function常见)只要实现了http.Handler接口,就能作为http请求的handler.

http.Handler接口

type Handler interface{
    ServeHTTP(ResponseWrite,* Request)
}

这是一些共用的handler

  • FileServer
  • NotFoundHandler
  • RedirectHandler
  • StripPrefix
  • TimeoutHandler

自定义Handlers

type messageHandler struct{
    message string
}

//implement http.Handler interface
func (m *messageHandler)ServeHTTP(w http.ResponseWrite,r *http.Request){
    fmt.Fprintf(w,m.message)
}

messageHandler 结构体实现了http.Handler接口,可以作为http请求的handler

  • 使用自定义的Handler
// book
package main

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

type messageHandler struct {
    message string
}

//implement http.Handler interface
func (m *messageHandler) ServeHTTP(w http.ResponseWrite, r *http.Request) {
    fmt.Fprintf(w, m.message)
}

func main() {
    mux := http.NewServeMux()

    mh1 := &messageHandler{"欢迎使用Go"}
    mux.Handle("/welcome", mh1)

    mh2 := &messageHandler{"Go这的很酷啊!"}
    mux.Handle("/message", mh2)

    log.Println("Listening...")
    http.ListenAndServe(":9090", mux)
}

在浏览器输入对应的路径就能打印出相应的信息

使用方法(函数)作为 Handlers

在上面的例子,使用结构体struct,实现了http.handler接口,从而作为了handler,比较"麻烦",还有更好的方式来实现:使用函数作为handler,只要这个函数的返回值是http.Handler

1.http.HandlerFunc类型

可以使用http.HandlerFunc类型来得到一个HTTP的handler,可以把任意一个有func(http.ResponseWriter, http.Request)标示的函数转换为一个HandlerFunc. HandlerFunc类型
内置了方法ServeHTTP(http.ResponseWriter,
http.Request),所以符合http.Handler接口,作为一个HTTP的handler
栗子如下

// book
package main

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

func messageHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "欢迎使用Go开发")
}

func main() {
    mux := http.NewServeMux()

    //Convert the messageHandler function to a HandlerFunc type
    mh := http.HandlerFunc(messageHandler)
    mux.Handle("/welcome", mh)

    log.Println("Listening...")
    http.ListenAndServe(":9090", mux)
}

有一种情况:假如想传递数据库的链接对象到一个handler函数中,从而在函数重用他.可以写一个函数,用一个参数接收值,然后返回值是http.Handler.在Go中,可以使用闭包(closure,匿名函数).

代码栗子

package main

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

//Writing Handler Logic into a Closure
func messageHandler(message string) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, message)
    })
}

func main() {
    mux := http.NewServeMux()

    mux.Handle("/welcome", messageHandler("欢迎使用Go"))
    mux.Handle("/message", messageHandler("Hello Go!"))

    log.Println("Listening...")
    http.ListenAndServe(":9090", mux)
}

这种方式对于实际工作中非常有用,可以为程序的handler函数的上下文,提供有用的值.(明天学习Web Development with Go ServeMux.HandleFunc Function)

相关文章

  • Go web server开发学习1

    net/http 包 如果想使用Go建立一个web程序和web APIs,或者建立一个简单的HTTP服务器,最重要...

  • Go web server开发学习2

    DefaultServeMux DefaultServeMux在http包使用的时候初始化 http包使用Defa...

  • go web开发学习之路

    基础:go 原生web开发1、go web的工作原理2、搭建一个简单的go web站点3、go web中载入静态文...

  • 2017-06-28

    最近看的书1.学习go语言中文 2遍2.flask web开发 基于python的web应用开发实践3.pytho...

  • Go Web编程.epub

    【下载地址】 《Go Web编程》介绍如何用Go语言进行Web应用的开发,将Go语言的特性与Web开发实战组合到一...

  • Node.js从零搭建

    主要是学习了Node.js从零开发Web Server博客,而将学习内容做个总结。 1.nodejs介绍 node...

  • go web开发学习

    DNS查询 1,查询本地hosts文件 2,查询本地解析器缓存 3,请求本地dns服务器,有可能属于本地域则直接返...

  • golang web开发 Handler测试利器httptest

    我们用go开发一个Web Server后,打算单元测试写的handler函数,在不知道httptest之前,使用比...

  • go学习计划 2018-07-13

    go语言入门及实战 go web开发 go源码及项目阅读

  • Go语言web框架学习—Gin

    Go语言web框架学习—Gin 开发环境:操作系统:ubuntu1804 x64Golang 版本:go1.12....

网友评论

      本文标题:Go web server开发学习1

      本文链接:https://www.haomeiwen.com/subject/rsjnjttx.html