艺高人胆大肘子

艺高人胆大肘子

使用Go实现一个简单的Web服务器

Go
44
2024-05-12
使用Go实现一个简单的Web服务器

前言

Go语言因其简单性、高效的性能以及出色的并发支持而广受欢迎。将通过一个简单的示例,展示如何处理Web请求、配置路由以及如何使用表单。

项目结构

首先,让我们看一下项目的结构:

├── go.mod
├── main.go
├── main_test.go
├── README.md
└── static
    ├── form.html
    └── index.html
  • main.go: 包含了服务器的主要逻辑。

  • static/: 存放静态文件,如HTML表单和首页。

  • go.mod: 定义了项目的依赖。

  • main_test.go: 用于编写测试代码。

  • README.md: 项目的说明文件。

核心代码解析

接下来,我们详细解析main.go中的代码。

导入必需的包

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

这些包为日志记录、格式化输出和HTTP服务器功能提供支持。

常量定义

const (
	port              = ":8080"
	pathHello         = "/hello"
	pathForm          = "/form"
	errorNotFoundMsg  = "404 not found"
	errorMethodMsg    = "Method is not supported"
	successPostMsg    = "POST request successful"
	startingServerMsg = "Starting server at port 8080"
)

这里定义了服务器端口、路由路径和一些常用的消息文本。

处理函数

func handleForm(w http.ResponseWriter, r *http.Request) {
	if err := r.ParseForm(); err != nil {
		log.Printf("Error parsing form: %v", err)
		http.Error(w, fmt.Sprintf("ParseForm() error: %v", err), http.StatusInternalServerError)
		return
	}
	name := r.FormValue("name")
	address := r.FormValue("address")
	response := fmt.Sprintf("%s\nName = %s\nAddress = %s", successPostMsg, name, address)
	fmt.Fprintln(w, response)
}

handleForm函数处理对/form路径的POST请求,解析提交的表单,并回应提交者的姓名和地址。


func handleHello(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != pathHello {
		http.Error(w, errorNotFoundMsg, http.StatusNotFound)
		return
	}
	if r.Method != "GET" {
		http.Error(w, errorMethodMsg, http.StatusNotFound)
		return
	}
	fmt.Fprintln(w, "hello!")
}

handleHello函数响应/hello路径上的GET请求,向访问者发送简单的问候。
路由配置与服务器启动

func setupRoutes() {
	http.Handle("/", http.FileServer(http.Dir("./static")))
	http.HandleFunc(pathForm, handleForm)
	http.HandleFunc(pathHello, handleHello)
}

func main() {
	setupRoutes()
	log.Println(startingServerMsg)
	if err := http.ListenAndServe(port, nil); err != nil {
		log.Fatal("Error starting server:", err)
	}
}

main函数中,我们配置了服务器的路由,并在8080端口启动了服务器。

总结

这个示例演示了使用Go语言创建一个基本的Web服务器的过程,从处理静态文件到响应Web请求。Go的简洁性和强大的标凈库使得开发高性能的Web应用成为可能。


希望这篇文章能帮助你入门Go Web开发!如需查看完整的项目代码,请访问我的GitHub仓库:https://github.com/HarleyQiu/go-server