go http服务器

net/http包封装了TCP连接和报文解析等细节,使用时只需要和http.ResponseWriter和*http.Request这两个对象交互就行。
对应的处理函数,需要把请求对象传递进来,将处理结果写入相应对象中。

package main

import "net/http"

func main() {
    http.HandleFunc("/", handle) // 第一个参数表示处理所有的请求,还没有路由转发;第二个参数表示使用哪个处理函数
    http.ListenAndServe(":8080", nil) // 表示监听本地8080端口,nil表示路由表?
    //func ListenAndServe(addr string, handler Handler)
    //http.Handler对应于HTTP请求,是一个接口,只有一个方法ServeHTTP(ResponseWriter, *Request)
    //在第二个参数为nil的情况下,handler默认使用DefaultServeMux
    //var DefaultServeMux = &defaultServeMux,而defaultServeMux为 var defaultServeMux ServeMux
    //ServuMux is an HTTP request multiplexer,是一个结构体类型,是go默认的路由表
    //type ServeMux struct {
    //    mu    sync.RWMutex
    //    m     map[string]muxEntry //存放具体的路由信息, muxEntry是一个结构体,里面包含Handler接口类型变量
    //    hosts bool // whether any patterns contain hostnames
    //}
}

func handle(w http.ResponseWriter, r *http.Request) { // 处理函数,参数为请求对象http.ResponseWriter和响应对象*http.Request
    w.Write([]byte("Hello World"))  // 不论请求内容是啥,响应都是返回Hello World
}
package main

import (
    "net/http"
)

func main() {
    http.Handle("/", &helloHandler{}) //第二个参数为结构体类型,绑定一个方法,实现Handler接口
    //func Handle(pattern string, handler Handler) Handler是一个接口,只有一个ServeHTTP(ResponseWriter, *Request)方法
    http.ListenAndServe(":12345", nil) //监听本地12345端口
}

type helloHandler struct{}

func (this *helloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello World"))
}

http.Handle和http.HandleFunc的第二个参数都需要一个Handler的具体实现,所以只要实现ServeHTTP方法的都可以作为一个Handler。

package main

import(
    "net/http"
)

func main() {
    myServer := http.Server{ // 自定义的server
        Addr: ":8080",
        Handler: &myHandler{}, // 对应的处理函数,暂时缺少一些关于路由的设置,无法进行处理
        ... // 其他的一些设置
    }
    myServer.ListenAndServe()
}

type myHandler struct {}

func (this myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // 这里绑定myHandler使用 this *myHandler 也可以,有什么区别?
    // ...
}

当把main函数和对应路由的处理函数放在同一包下不同的文件,运行时需要一同运行。

如下打印r *http.Request.
使用curl命令向本地webserver发送请求,打印r显示的内容为
&{GET /hello HTTP/1.1 1 1 map[User-Agent:[curl/7.47.0] Accept:[/]] {} 0 [] false localhost:12345 map[] map[] map[] 127.0.0.1:60298 /hello 0xc420062300}。
其中Header为map[User-Agent:[curl/7.47.0] Accept:[/]] ——-Header Header
{} ————Body io.ReadCloser
<nil> ———-GetBody func()(io.ReadCloser, error)
[] ———–TransferEncoding []string
map[] ———–Form url.Values
map[] —————PostForm url.Values

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/hello", handle)
    http.ListenAndServe(":12345", nil)
}

func handle(w http.ResponseWriter, r *http.Request) {
    fmt.Println(r)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值