用 Go 实现简单的 HTTP 服务 - 从服务端到客户端
案例介绍
在 Go 语言中,构建轻量级 HTTP 服务并实现客户端交互是常见需求。本文将通过一个简单的加法服务案例,解析 Go 如何快速搭建服务端接口并编写对应的客户端调用逻辑。
服务端代码(server.go)
package main
import (
"encoding/json"
"fmt"
"net/http"
"strconv"
)
func main() {
/*
请求格式
http://127.0.0.1:8000/add?a=1&b=1
返回Json
{
data : 3
}
*/
http.HandleFunc("/add", func(writer http.ResponseWriter, request *http.Request) {
_ = request.ParseForm() //解析数据
fmt.Println("path: ", request.URL.Path) //call ID ,即路径
a, _ := strconv.Atoi(request.Form["a"][0]) //提取参数
b, _ := strconv.Atoi(request.Form["b"][0])
jsonData, _ := json.Marshal(map[string]int{ //数据转为json
"data": a + b,
})
writer.Header().Set("Content-Type", "application/json") //设置请求类型
_, _ = writer.Write(jsonData)
})
_ = http.ListenAndServe(":8000", nil)
}
核心在于通过net/http包创建 HTTP 服务。代码中注册了/add路径的处理函数,当客户端请求该路径时,处理函数会解析 URL 中的a和b参数,将其转换为整数后相加,最后以 JSON 格式返回结果。这里需要注意设置响应头的Content-Type为application/json,确保客户端能正确解析数据。
客户端代码(client.go)
package main
import (
"encoding/json"
"fmt"
"github.com/kirinlabs/HttpRequest"
)
type ResponseData struct {
Data int `json:"data"`
}
func add(a, b int) int {
req := HttpRequest.NewRequest()
res, _ := req.Get(fmt.Sprintf("http://127.0.0.1:8000/%s?a=%d&b=%d", "add", a, b))
body, _ := res.Body()
resData := ResponseData{}
_ = json.Unmarshal(body, &resData)
return resData.Data
}
func main() {
fmt.Println(add(2, 4))
}
通过第三方库 github.com/kirinlabs/HttpRequest 发送 HTTP 请求。客户端定义了add函数,该函数接收两个整数参数,拼接成 http://127.0.0.1:8000/add?a=xxx&b=xxx格式的 URL 并发送 GET 请求。获取响应后,客户端将 JSON 数据解析到ResponseData结构体中,最终返回计算结果。
经验总结
这个案例虽简单,但涵盖了 HTTP 服务开发的核心流程:服务端路由注册、参数解析、响应构建;客户端请求发送、数据解析。实际开发中,还需考虑错误处理(如参数缺失、类型转换失败等)、请求超时控制等问题。通过这个示例,我们可以快速理解 Go 语言在 HTTP 通信方面的简洁高效特性,为构建更复杂的 Web 服务打下基础。