首页 Go 正文
  • 本文约1502字,阅读需8分钟
  • 21
  • 0

用 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 服务打下基础。

评论
友情链接