Go的http包代码执行流程

package main

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

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)
	}
}

首先调用Http.HandleFunc 按顺序做了几件事

1 调用了DefaultServerMux的HandleFunc

2 调用了DefaultServerMux的Handle

3 往DefaultServeMux的map[string]muxEntry中增加对应的handler和路由规则

其次调用http.ListenAndServe(":9090", nil) 按顺序做了几件事情

1 实例化Server

2 调用Server的ListenAndServe()

3 调用net.Listen("tcp", addr)监听端口

4 启动一个for循环,在循环体中Accept请求

5 对每个请求实例化一个Conn,并且开启一个goroutine为这个请求进行服务go c.serve()

6 读取每个请求的内容w, err := c.readRequest()

7 判断handler是否为空,如果没有设置handler(这个例子就没有设置handler),handler就设置为 DefaultServeMux

8 调用handler的ServeHttp

9 在这个例子中,下面就进入到DefaultServerMux.ServeHttp

10 根据request选择handler,并且进入到这个handler的ServeHTTP mux.handler(r).ServeHTTP(w, r)

11 选择handler:

  • A 判断是否有路由能满足这个request(循环遍历ServerMux的muxEntry)
  • B 如果有路由满足,调用这个路由handler的ServeHttp
  • C 如果没有路由满足,调用NotFoundHandler的ServeHttp
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTTP 的源码在 Go 的标准库中,可以在 `$GOROOT/src/net/http` 目录下找到。 整个 HTTP 处理过程可以简单概括为如下几步: 1. `Server.ListenAndServe()`:启动 HTTP 服务器,开始监听请求。 2. `Server.Serve()`:接收并处理客户端请求。 3. `ServeHTTP()`:根据请求的 URL 路径和请求方法,找到对应的处理函数(Handler),并调用它处理请求。 4. 处理函数读取请求的 Header 和 Body,解析参数,执行相应的业务逻辑,构造响应数据。 5. 处理函数将响应数据写入 ResponseWriter,发送响应给客户端。 具体来说,源码中的 `http.Server` 结构体定义了 HTTP 服务器的配置信息,括监听地址和端口、处理方法等。`Server.ListenAndServe()` 方法会启动 HTTP 服务器,开始监听请求。 当有新的请求到达时,`Server.Serve()` 方法会接收并处理请求。它首先会解析请求的 Header 和 Body,然后根据请求的 URL 路径和请求方法找到对应的处理函数(Handler),并调用它处理请求。 处理函数需要实现 `http.Handler` 接口,其中最关键的方法是 `ServeHTTP()`。在这个方法中,处理函数可以读取请求的 Header 和 Body,解析参数,执行相应的业务逻辑,构造响应数据。处理函数需要将响应数据写入 `ResponseWriter`,然后调用 `ResponseWriter.Flush()` 方法将响应数据发送给客户端。 总体来说,Gohttp 实现了一个简单易用的 HTTP 服务器,通过源码可以清晰地了解整个 HTTP 处理过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值