15分钟学 Go 第 26 天:根本的Web服务

[复制链接]
发表于 2026-1-2 22:23:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
第26天:根本的Web服务

学习目的

在这一节中,我们将学习怎样创建一个简单的HTTP服务器。我们将先容Go语言中的net/http包,具体实现一个根本的Web服务,同时明确HTTP哀求和相应的根本概念。
1. Go的HTTP服务器概述

Go语言内置的net/http包使得构建Web服务变得敏捷且简单。我们可以通过少量的代码实现一个功能齐备的HTTP服务器。以下是我们要实现的服务的根本功能:

  • 相应HTTP GET哀求
  • 体现简单的文本消息
  • 可以在欣赏器中访问
HTTP协议扼要先容

HTTP(超文本传输协议)是用于在Web上传输数据的协议。它使用哀求-相应模子,客户端发送哀求,服务器返回相应。常见的HTTP方法包罗GET、POST、PUT和DELETE。
2. 创建一个简单的HTTP服务器

2.1 项目结构

起首,我们创建一个新的Go项目。目次结构如下:
  1. /simple-http-server
  2.     └── main.go
复制代码
2.2 编写代码

下面是一个最简单的HTTP服务器代码示例:
  1. package main
  2. import (
  3.     "fmt"
  4.     "net/http"
  5. )
  6. // handler 函数处理HTTP请求
  7. func handler(w http.ResponseWriter, r *http.Request) {
  8.     // 设置响应头
  9.     w.Header().Set("Content-Type", "text/plain")
  10.     // 向客户端写入内容
  11.     fmt.Fprintf(w, "Hello, world! You requested: %s\n", r.URL.Path)
  12. }
  13. func main() {
  14.     // 定义处理器
  15.     http.HandleFunc("/", handler)
  16.     // 启动HTTP服务器
  17.     fmt.Println("Starting server at :8080")
  18.     if err := http.ListenAndServe(":8080", nil); err != nil {
  19.         fmt.Println("Server failed to start:", err)
  20.     }
  21. }
复制代码
2.3 代码解说


  • package main:界说一个主包。
  • import:引入net/http和fmt包,前者用于处置惩罚HTTP哀求,后者用于格式化I/O。
  • handler 函数:这个函数用来处置惩罚传入的HTTP哀求。

    • w http.ResponseWriter:用于构建HTTP相应。
    • r *http.Request:体现吸收到的哀求。

  • main 函数:

    • http.HandleFunc("/", handler):将根路径的哀求路由到handler函数。
    • http.ListenAndServe(":8080", nil):在端口8080启动HTTP服务,第二个参数设为nil体现使用默认的多路复用器。

2.4 运行服务器

要运行这个代码,你可以在终端中导航到项目目次并运行:
  1. go run main.go
复制代码
然后在欣赏器中访问 http://localhost:8080,你应该会看到:
  1. Hello, world! You requested: /
复制代码
3. 完备流程图

以下是HTTP哀求和相应过程的简单流程图:
  1. +---------------------+
  2. |     Client (Browser)|
  3. +---------------------+
  4.            |
  5.            |  Send HTTP GET request
  6.            |  (e.g., http://localhost:8080)
  7.            v
  8. +---------------------+
  9. |   HTTP Server       |
  10. |   (Go Application)  |
  11. |                     |
  12. |  Handle request     |
  13. |   +---------------+ |
  14. |   |  handler      | |
  15. |   +---------------+ |
  16. |       Generate     |
  17. |       Response     |
  18. |                    |
  19. |  Send Response     |
  20. |  (Hello, world!)   |
  21.            |
  22.            v
  23. +---------------------+
  24. |     Client (Browser)|
  25. +---------------------+
复制代码
4. 常见HTTP状态码

在创建Web服务时,相识HTTP状态码黑白常告急的。以下是一些常见的状态码及其寄义:
状态码寄义200OK404Not Found500Internal Server Error301Moved Permanently403Forbidden5. 相应内容范例

在HTTP相应中,Content-Type头部字段告知客户端返回内容的范例。以下是一些常用的MIME范例:
MIME Type阐明text/htmlHTML文档text/plain平常文本application/jsonJSON格式application/xmlXML文件你可以在我们的代码中根据须要改变Content-Type。
6. 加强功能:处置惩罚差别的路径

在本节,我们将如安在我们的HTTP服务器中处置惩罚差别的URL路径。
6.1 修改 handler 函数
  1. func handler(w http.ResponseWriter, r *http.Request) {
  2.     switch r.URL.Path {
  3.     case "/":
  4.         w.Header().Set("Content-Type", "text/plain")
  5.         fmt.Fprintf(w, "Hello, world! You requested: %s\n", r.URL.Path)
  6.     case "/about":
  7.         w.Header().Set("Content-Type", "text/plain")
  8.         fmt.Fprintf(w, "This is the About page.")
  9.     default:
  10.         w.WriteHeader(http.StatusNotFound) // 返回404状态码
  11.         fmt.Fprintf(w, "404 page not found")
  12.     }
  13. }
复制代码
6.2 测试差别的URL


  • 访问 / 会得到 “Hello, world!” 的相应。
  • 访问 /about 会得到关于页面的相应。
  • 访问未界说的路径将返回404错误。
7. 处置惩罚GET和POST哀求

7.1 增长POST处置惩罚

我们可以扩展服务器来处置惩罚POST哀求。示例代码如下:
  1. func handler(w http.ResponseWriter, r *http.Request) {
  2.     if r.Method == http.MethodPost {
  3.         w.Header().Set("Content-Type", "text/plain")
  4.         fmt.Fprintf(w, "Received a POST request!
  5. \n")
  6.         return
  7.     }
  8.     // 处理其他请求
  9.     switch r.URL.Path {
  10.     case "/":
  11.         // 处理GET请求
  12.         w.Header().Set("Content-Type", "text/plain")
  13.         fmt.Fprintf(w, "Hello, world! You requested: %s\n", r.URL.Path)
  14.     case "/about":
  15.         w.Header().Set("Content-Type", "text/plain")
  16.         fmt.Fprintf(w, "This is the About page.")
  17.     default:
  18.         w.WriteHeader(http.StatusNotFound) // 返回404状态码
  19.         fmt.Fprintf(w, "404 page not found")
  20.     }
  21. }
复制代码
7.2 测试POST哀求

可以使用工具如Postman或curl发送POST哀求:
  1. curl -X POST http://localhost:8080
复制代码
相应将是:
  1. Received a POST request!
复制代码
8. 错误处置惩罚

在实际应用中,错误处置惩罚非常告急。我们可以改进代码逻辑以处置惩罚埋伏的错误,比方无法启动服务器时的错误提示。
  1. if err := http.ListenAndServe(":8080", nil); err != nil {
  2.     log.Fatalf("Could not start server: %s\n", err)
  3. }
复制代码
日志日志记载

使用log包来记载错误和信息是进步应用可维护性的告急一环。
9. 总结

在这一节中,你学习了怎样使用Go构建一个简单的HTTP服务器。你把握了根本的HTTP哀求处置惩罚,怎样界说路由,并可以大概处置惩罚GET和POST哀求。相识HTTP协议及状态码也是实现Web服务的告急知识。
10. 下一步

在后续的学习中,我们将探索以下内容:

  • 使用第三方路由库(如gorilla/mux)
  • 实现中心件
  • 处置惩罚JSON数据
  • 构建RESTful API

怎么样本日的内容还满足吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,复兴666,送您代价199的AI大礼包。末了,祝您早日实现财政自由,还请给个赞,谢谢!
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表