实现一个简单的 Web 服务器
首先,我们需要导入 Golang 的 HTTP 包,并创建一个处理器函数来处理请求。```go package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World!") } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) } ```
在上面的代码中,我们创建了一个名为 `handler` 的函数,它接收两个参数,一个是 `http.ResponseWriter`,用于写入响应内容,另一个是 `*http.Request`,用于读取请求信息。 接下来,我们使用 `http.HandleFunc` 函数将 `/` 路径与我们刚刚创建的 `handler` 函数关联起来。然后,我们使用 `http.ListenAndServe` 函数来启动我们的 Web 服务器。 运行以上代码,你将会看到一个简单的 Web 服务器在本地的 8080 端口运行。现在,当你访问 http://localhost:8080 ,你将会看到 "Hello, World!" 字样的响应。处理不同的 HTTP 请求
除了处理基本的GET请求之外,我们还可以通过 Golang 的 HTTP 包来处理其他类型的请求,如 POST、PUT、DELETE 等。```go func handler(w http.ResponseWriter, r *http.Request) { switch r.Method { case "GET": fmt.Fprintf(w, "Hello, GET request!") case "POST": fmt.Fprintf(w, "Hello, POST request!") default: http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) } } ```
在上面的例子中,我们使用 `switch` 条件语句来检查请求的方法类型,并根据不同的方法返回不同的响应。如果请求方法不是 GET 或 POST,我们还可以使用 `http.Error` 函数返回一个自定义的错误消息和状态码。路由请求
处理不同的请求方法只是 Web 开发的一个方面,我们经常需要根据请求的路径来路由请求到不同的处理器函数。 Golang 的 HTTP 包提供了 `http.NewServeMux` 类型来实现路由功能。```go func handler1(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "This is handler1") } func handler2(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "This is handler2") } func main() { mux := http.NewServeMux() mux.HandleFunc("/handler1", handler1) mux.HandleFunc("/handler2", handler2) http.ListenAndServe(":8080", mux) } ```
在上面的代码中,我们首先创建了一个 `http.NewServeMux` 实例,用于处理不同的路径。 然后,我们使用 `mux.HandleFunc` 函数将不同路径与不同的处理器函数关联起来。 当我们向服务器发出 `/handler1` 的请求时,会调用 `handler1` 函数并返回消息 "This is handler1";当我们向服务器发出 `/handler2` 的请求时,会调用 `handler2` 函数并返回消息 "This is handler2"。获取请求参数
在实际的 Web 开发中,我们经常需要从请求中获取参数,比如查询字符串参数或 POST 表单参数等。```go func handler(w http.ResponseWriter, r *http.Request) { name := r.URL.Query().Get("name") fmt.Fprintf(w, "Hello, %s!", name) } ```
在上面的代码中,我们使用 `r.URL.Query()` 方法来获取 URL 中的查询字符串,并使用 `Get` 方法获取指定名称的参数值。 当我们向服务器发出 `/hello?name=John` 的请求时,服务器将返回消息 "Hello, John!"。返回 JSON 响应
在现代的 Web 开发中,经常需要返回 JSON 格式的响应数据。```go type Person struct { Name string `json:"name"` Age int `json:"age"` } func handler(w http.ResponseWriter, r *http.Request) { person := Person{ Name: "John", Age: 25, } jsonData, err := json.Marshal(person) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") w.Write(jsonData) } ```
在上面的代码中,我们定义了一个 `Person` 结构体,并将其转换为 JSON 格式的数据。 然后,我们使用 `json.Marshal` 函数将结构体转换为 JSON 数据,并将其发送给客户端。 此外,我们还使用 `w.Header().Set` 方法设置响应头的 Content-Type,将其设置为 "application/json",以告知客户端响应数据的类型。