• 使用Golang搭建web服务


    如何用golang搭建一个web服务呢?菜鸟官网的go web编程教程已经介绍了web服务器的工作原理,这里就不赘述了。

    我们先看个例子:http.go

    package main
    
    import (
        "fmt"
        "io"
        "log"
        "net/http"
    )
    
    func main() {
        http.HandleFunc("/test", doRequest)      //   设置访问路由
        err := http.ListenAndServe(":8000", nil) //设置监听的端口
        if err != nil {
            log.Fatal("ListenAndServe: ", err)
        }
    }
    
    func doRequest(w http.ResponseWriter, r *http.Request) {
        r.ParseForm()       //解析url传递的参数,对于POST则解析响应包的主体(request body)
        //fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
        //fmt.Println("path", r.URL.Path)
        //fmt.Println("scheme", r.URL.Scheme)
        //for k, v := range r.Form {
        //    fmt.Println("key:", k)
        //    fmt.Println("value:", strings.Join(v, ""))
        //}
        fmt.Fprintf(w, "service start...") //这个写入到w的是输出到客户端的 也可以用下面的 io.WriteString对象
    
        //注意:如果没有调用ParseForm方法,下面无法获取表单的数据
        //query := r.URL.Query()
        var uid string // 初始化定义变量
        if r.Method == "GET" {
            uid = r.FormValue("uid")
        } else if r.Method == "POST" {
            uid = r.PostFormValue("uid")
        }
        io.WriteString(w, "uid = "+uid)
    }

    go run http.go命令运行程序。
    之后在浏览器中输入地址: http://127.0.0.1:8000/test?uid=10086,看下结果。

      在main函数中,我们从net/http包中调用了一个http.HandleFucn函数来注册一个处理函数

    这个函数接受两个参数。第一个是字符串,这个就是进行路由匹配,我这里是/test路由。第二个参数是一个func (ResponseWriter, Request)的签名。

    我们的doRequest函数就是这样的签名。下一行中的http.ListenAndServe(":8000", nil),表示监听localhost的8000端口,暂时忽略掉nil。

       在doRequest函数中我们有两个参数,一个是http.ResponseWriter类型的。它类似响应流,实际上是一个接口类型。

    第二个是http.Request类型,类似于HTTP 请求。我们不必使用所有的参数,如果只是简单的输出,那么我们只需要使用http.ResponseWriter,io.WriteString,将会把输出流写入数据。

    我们再稍微改下,大家请注意修改的部分(这里我们只调整 main函数部分代码)

    func main() {
        mux := http.NewServeMux()
        mux.HandleFunc("/test", doRequest)
        err :=  http.ListenAndServe(":8000", mux) //设置监听的端口
        if err != nil {
            log.Fatal("ListenAndServe: ", err)
        }
    }

    这个例子中,我们不再在函数http.ListenAndServe使用nil了。这个例子跟上面的例子其实是一样的。使用http注册hanlder 函数模式就是用的ServeMux。
    我们再调整下看下更复杂的例子:

    package main
    
    import (
        "fmt"
        "io"
        "log"
        "net/http"
    )
    
    var mux map[string]func(http.ResponseWriter, *http.Request)
    
    func main() {
        server := http.Server{
            Addr:    ":8000",
            Handler: &doHandler{},
        }
    
        mux = make(map[string]func(http.ResponseWriter, *http.Request))
        mux["/test"] = doRequest
    
        err := server.ListenAndServe()
        if err != nil {
            log.Fatal("ListenAndServe: ", err)
        }
    }
    
    type doHandler struct{}
    
    func (*doHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        if res, ok := mux[r.URL.String()]; ok {
            res(w, r)
            return
        }
    
        io.WriteString(w, "url params: "+r.URL.String())
    }
    func doRequest(w http.ResponseWriter, r *http.Request) {
        r.ParseForm()                      //解析url传递的参数,对于POST则解析响应包的主体(request body)
        fmt.Fprintf(w, "service start...") //这个写入到w的是输出到客户端的 也可以用下面的 io.WriteString对象
    }

    这个例子我们没有定义ServeMux,而是使用了http.Server。都是用net/http包运行了服务器。

  • 相关阅读:
    卖菜起家赚到100万,他怎样做到的?
    百万网站创始人,痴迷网络经营,成就创业梦想
    徐小平靠投资进行创业,他却格外与众不同
    金融专业学生收卖废品,做起了“破烂王”
    pod setup命令失败解决方法
    pod setup命令失败解决方法
    pod setup命令失败解决方法
    pod setup命令失败解决方法
    PHP的闭包和匿名函数
    PHP的闭包和匿名函数
  • 原文地址:https://www.cnblogs.com/phpper/p/10408206.html
Copyright © 2020-2023  润新知