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


相关文章
|
10月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
688 4
|
移动开发 数据挖掘 开发者
服务器发送事件(SSE)在现代Web开发中的关键作用
服务器发送事件(SSE)是HTML5标准协议,用于服务器主动向客户端推送实时数据,适合单向通信场景。相比WebSocket,SSE更简洁高效,基于HTTP协议,具备自动重连、事件驱动等特性。常见应用场景包括实时通知、新闻推送、数据分析等。通过Apipost等工具可轻松调试SSE,助力开发者构建高效实时Web应用。示例中,电商平台利用SSE实现秒杀活动通知,显著减少延迟并简化架构。掌握SSE技术,能大幅提升用户体验与开发效率。
|
10月前
|
开发框架 前端开发 Go
【GoGin】(0)基于Go的WEB开发框架,GO Gin是什么?怎么启动?本文给你答案
Gin:Go语言编写的Web框架,以更好的性能实现类似Martini框架的APInet/http、Beego:开源的高性能Go语言Web框架、Iris:最快的Go语言Web框架,完备的MVC支持。
733 1
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
600 61
|
数据采集
Haskell编程中,利用HTTP爬虫实现IP抓取
以上就是利用Haskell编写IP抓取爬虫的详细步骤。希望这篇文章的演示对于理解在Haskell这种函数式编程语言中如何实现网络爬虫有所帮助,而其中的网络访问、标签解析和列表处理等技术在许多其他的问题中都有广泛的应用。
278 26
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
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。
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。