Go 网络编程:HTTP服务与客户端开发

简介: Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。

 

Go 在标准库中内置了功能强大的 net/http 包,可快速构建高并发、高性能的 HTTP 服务,广泛应用于微服务、Web后端、API中间层等场景。


一、快速创建一个HTTP服务

示例:最简Hello服务

package main import (  "fmt"  "net/http" ) func helloHandler(w http.ResponseWriter, r *http.Request) {  fmt.Fprintf(w, "Hello, Go Web!") } func main() {  http.HandleFunc("/", helloHandler)  fmt.Println("Listening on http://localhost:8080/")  http.ListenAndServe(":8080", nil) }

二、请求与响应对象详解

  • http.Request:封装了客户端请求的所有信息(URL、Header、Body等)
  • http.ResponseWriter:用于构造服务器的响应

示例:获取请求信息

func infoHandler(w http.ResponseWriter, r *http.Request) {  fmt.Fprintf(w, "Method: %s\n", r.Method)  fmt.Fprintf(w, "URL: %s\n", r.URL.Path)  fmt.Fprintf(w, "Header: %v\n", r.Header) }

三、处理URL参数与POST数据

1. 获取查询参数

func queryHandler(w http.ResponseWriter, r *http.Request) {  name := r.URL.Query().Get("name")  fmt.Fprintf(w, "Hello, %s!", name) }

访问:http://localhost:8080/query?name=Go

2. 处理表单数据(POST)

func formHandler(w http.ResponseWriter, r *http.Request) {  r.ParseForm()  username := r.FormValue("username")  fmt.Fprintf(w, "Welcome, %s!", username) }

四、自定义HTTP路由与Handler

使用 http.ServeMux

func main() {  mux := http.NewServeMux()  mux.HandleFunc("/hello", helloHandler)  mux.HandleFunc("/info", infoHandler)  http.ListenAndServe(":8080", mux) }

使用第三方路由器(如 gorilla/muxchi 等)

// 示例略,可根据需要引入第三方库

五、构建HTTP客户端请求

Go 提供了强大的 http.Client 支持 GET/POST 等请求。

示例:GET请求

resp, err := http.Get("https://httpbin.org/get") defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body))

示例:POST请求

data := url.Values{"name": {"Go"}} resp, err := http.PostForm("https://httpbin.org/post", data) defer resp.Body.Close()

六、JSON接口的处理

JSON响应

func jsonHandler(w http.ResponseWriter, r *http.Request) {  type Resp struct {  Status string `json:"status"`  }  w.Header().Set("Content-Type", "application/json")  json.NewEncoder(w).Encode(Resp{"ok"}) }

JSON请求解析

func receiveJSON(w http.ResponseWriter, r *http.Request) {  type Req struct {  Name string `json:"name"`  }  var data Req  json.NewDecoder(r.Body).Decode(&data)  fmt.Fprintf(w, "Hello, %s", data.Name) }

七、静态文件服务

http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("public"))))

访问 /static/index.html 实际读取 public/index.html 文件。


八、HTTP中间件的编写

中间件常用于实现日志、认证、限流等功能。

func loggingMiddleware(next http.Handler) http.Handler {  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {  log.Printf("Request: %s %s", r.Method, r.URL.Path)  next.ServeHTTP(w, r)  }) }

九、启动HTTPS服务(SSL)

http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)

用于生产环境时,请使用自动证书工具如 Let’s Encrypt + Caddy/Nginx 做代理。


十、总结

能力 工具与API
启动Web服务 http.ListenAndServe
构造REST接口 HandlerFunc + JSON 编解码
发起HTTP请求 http.Get, http.Post, http.Client
路由与中间件 ServeMux 或第三方路由器
文件服务与HTTPS http.FileServer / ListenAndServeTLS

 

相关文章
|
2月前
Vite使用svg-企业级开发(支持本地svg和网络svg渲染)
本教程介绍如何在Vite项目中集成SVG图标插件。首先安装`vite-plugin-svg-icons`,配置插件指向SVG图标目录,并注册全局组件。接着创建SVG图标组件,支持内部图标与外部图片展示。通过简单配置,即可在页面中灵活使用各类SVG图标,提升开发效率。
142 0
|
5月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
259 18
|
3月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
4月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
4月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
362 0
|
5月前
|
开发者
鸿蒙仓颉语言开发教程:网络请求和数据解析
本文介绍了在仓颉开发语言中实现网络请求的方法,以购物应用的分类列表为例,详细讲解了从权限配置、发起请求到数据解析的全过程。通过示例代码,帮助开发者快速掌握如何在网络请求中处理数据并展示到页面上,减少开发中的摸索成本。
鸿蒙仓颉语言开发教程:网络请求和数据解析
|
5月前
|
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。
|
Ubuntu 网络协议 Unix
02理解网络IO:实现服务与客户端通信
网络IO指客户端与服务端通过网络进行数据收发的过程,常见于微信、QQ等应用。本文详解如何用C语言实现一个支持多客户端连接的TCP服务端,涉及socket编程、线程处理及通信流程,并分析“一消息一线程”模式的优缺点。
256 0
|
存储 安全 中间件
用Go语言写HTTP中间件
在web开发过程中,中间件一般是指应用程序中封装原始信息,添加额外功能的组件。不知道为什么,中间件通常是一种不太受欢迎的概念。但我认为它棒极了。
473 90

热门文章

最新文章

下一篇