Go HTTP 编程 | 01 - 使用 http 包创建 Web 服务器

简介: Go HTTP 编程 | 01 - 使用 http 包创建 Web 服务器

一、Go 的 HTTP 标准库 net/http

Go 已经拥有成熟的 HTTP 标准库 net/http,即使不使用 Go 的 Web 框架如 Gin、Iris 等也可以快速的搭建起一个可以运行的 Web 服务,同时这个标准库可以对 Web 路由、静态文件、模板和cookie 等数据进行处理,事实上这些 Web 框架也都是基于 net/http 标准库来构建的。

使用 net/http 建立 Web 服务器

首先创建一个请求处理函数 sayHelloHandler,该函数接收一个 http.ResponseWriter 和 一个请求指针 *http.Request 作为参数,通过对请求中数据的提取之后写入指定的信息到 http.ResponseWriter 中。

在 main 函数中通过 http.HandleFunc 定义一个路由并将该路由与 sayHelloHandler 函数映射,然后通过 http.ListenAndServe 监听端口。

运行 main.go 文件,一个简单的 Web 服务器就运行起来了。

package main
// filename main.go
//noinspection ALL
import (
   "fmt"
   "log"
   "net/http"
   "strings"
)
//noinspection ALL
func main(){
   http.HandleFunc("/", sayHelloName)
   err := http.ListenAndServe(":9000", nil)
   if err != nil {
      log.Fatal("ListenAndServer: ", err)
   }
}
func sayHelloHandler(w http.ResponseWriter, r *http.Request){
   r.ParseForm() // 解析参数,默认是不会解析的
   fmt.Println(r.Form) // 输出
   fmt.Println("path", r.URL.Path)
   fmt.Print("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.Fprint(w, "Hello, Go HTTP")
}
复制代码

在浏览器中输入 http://localhost:9000/

image.png

控制台打印出的详细信息

image.png

net/http 运行机制

net/http 运行流程:

  1. 创建 Listen Socket 监听指定端口,等待客户端请求
  2. Listen Socket 接收客户端请求,得到 Client Socket,服务端通过 Clent Socket 与客户端进行通信
  3. 处理客户端请求,首先从 Client Socket 读取 HTTP 请求的信息,包括请求头和请求体,然后交给相应的 handler 函数处理,handler 处理完成后将数据通过 Client Socket 写给客户端。

image.png

整个过程我们需要了解三个问题:

  • net/http 是如何监听端口的?
  • net/http 是如何接收客户端请求的?
  • net/http 是如何分配 handler 的?

查看源码,点击 main.go 文件中 http.ListenAndServe(":9000", nil)ListenAndServe 函数,来到源码,再次点击 3222 行的 ListenAndServe

image.png

再次点击 2968 行的 Serve 函数:

image.png

image.png

Serve(l net.Listener) 函数就是处理接收客户端的请求信息。该函数中的 for 循环首先通过 net.Listener 接收请求 rw, err := l.Accept()for 循环之后又创建了一个 Conn,最后单独开了一个 goroutine go c.serve(connCtx);用户的每一次请求都是在一个单独的 goroutine 中执行的,不会相互影响。

点击 go c.serve(connCtx) 中的 serve(connCtx) 方法,在该方法中的第 1891 行通过 c.readRequest(ctx) 来解析请求:

image.png

然后在第 1966 行,根据请求解析结果通过 serverHandler{c.server}.ServeHTTP(w, w.req) 分配了一个 handler

image.png

点击查看 ServeHTTP 源码:

image.png

这里获取了一个 handler,调用 ListenAndServe 函数的时候传递的参数为 nil,因此这里默认分配了一个 DefaultServeMux 作为 handler。其实 DefaultServeMux 就是一个路由器,它用来匹配 URL 跳转到其响应的 handler 函数。

上述代码中 http.HandleFunc("/", sayHelloName) 就已经定义了路由规则,当请求为 / 时,路由就会转到 sayHelloName 方法,DefaultServeMux 就会调用 ServeHTTP 方法,则这个方法内部其实就是调用 sayHelloName 方法,然后将返回结果写入到 response 中,最后返回给客户端。

整个处理流程如下:

image.png


相关文章
|
6月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
388 61
|
5月前
|
人工智能 负载均衡 监控
使用 Go 和 Gin 实现高可用负载均衡代理服务器
本文基于Go语言和Gin框架,实现了一个企业级负载均衡代理服务器,支持动态路由、健康检查、会话保持等功能。具备高可用性与高性能,单节点支持100k+ QPS,延迟达亚毫秒级,并提供完整的压力测试方案与优化建议。
199 7
|
4月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
5月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
5月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
440 0
|
6月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
8月前
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
415 35
|
8月前
|
XML JSON 网络协议
利用HTTP POST协议实现简单的RPC协议:WireShark抓包分析
通过这种方式,我们可以使用HTTP POST实现简单的RPC协议,并使用WireShark进行抓包分析。这不仅可以帮助我们理解RPC协议的工作原理,也可以帮助我们调试和优化我们的代码。
451 30
|
8月前
|
Go API 定位技术
MCP 实战:用 Go 语言开发一个查询 IP 信息的 MCP 服务器
随着 MCP 的快速普及和广泛应用,MCP 服务器也层出不穷。大多数开发者使用的 MCP 服务器开发库是官方提供的 typescript-sdk,而作为 Go 开发者,我们也可以借助优秀的第三方库去开发 MCP 服务器,例如 ThinkInAIXYZ/go-mcp。 本文将详细介绍如何在 Go 语言中使用 go-mcp 库来开发一个查询 IP 信息的 MCP 服务器。
515 0
|
存储 安全 中间件
用Go语言写HTTP中间件
在web开发过程中,中间件一般是指应用程序中封装原始信息,添加额外功能的组件。不知道为什么,中间件通常是一种不太受欢迎的概念。但我认为它棒极了。
493 81