介绍 genapi:一个 Golang HTTP Client 生成代码库
本文将为大家介绍 genapi,一个用于自动生成 Golang HTTP Client 的代码库。如果你对这个项目感兴趣,可以访问 genapi 官网 或 GitHub 仓库 获取更多技术细节。 从手工到自动:Golang HTTP Client 的演进之路 在 Golang 开发中,调用 HTTP API 是一个非常常见的需求。本文将通过一个天气 API 的示例,介绍 HTTP Client 代码是如何从手工编写演进到自动生成的。让我们看看这个简单的天气 API: GET /api/weather?city=shanghai Response: { "temperature": 25, "humidity": 60, "condition": "sunny" } 原始手工编写 最初,我们可能会直接编写如下代码: func getWeather(city string) (*Weather, error) { resp, err := http.Get("https://api.weather.com/api/weather?city=" + city) if err != nil { return nil, err } defer resp.Body.Close() var weather Weather if err := json.NewDecoder(resp.Body).Decode(&weather); err != nil { return nil, err } return &weather, nil } 这种方式简单直接,但存在以下问题: URL 硬编码在代码中 参数拼接容易产生错误 错误处理逻辑重复 响应解析代码重复 模板化请求 为了解决上述问题,我们开始对代码进行抽象和模板化改造: type Client struct { baseURL string client *http.Client } func (c *Client) doRequest(method, path string, query url.Values, result interface{}) error { u, _ := url.Parse(c.baseURL + path) u.RawQuery = query.Encode() req, err := http.NewRequest(method, u.String(), nil) if err != nil { return err } resp, err := c.client.Do(req) if err != nil { return err } defer resp.Body.Close() return json.NewDecoder(resp.Body).Decode(result) } func (c *Client) GetWeather(city string) (*Weather, error) { query := url.Values{} query.Set("city", city) var weather Weather err := c.doRequest("GET", "/api/weather", query, &weather) return &weather, err } 这样的改进带来了以下好处: ...