在线词典的简单封装 | 青训营笔记

37 阅读2分钟

青训营小Demo在线词典的简单封装

按照我自己的理解简单封装了一下在线词典案例

分析过程

  1. 响应体的设置

省去了一些用不到的字段,只保留需要查找的单词、音标、翻译的内容、词组的使用

go
复制代码
// ResponseBody 响应体中Data的内容  
type ResponseBody struct {  
    Dictionary struct {  
        Entry string `json:"entry"` // 查找的单词  
        Prons struct {  
            EnUs string `json:"en-us"` // 美式音标  
            En string `json:"en"` // 英式音标  
        } `json:"prons"`  
        Explanations []string `json:"explanations"` // 翻译内容  
        WqxExample [][]string `json:"wqx_example"` // 词组使用  
    } `json:"dictionary"`  
}
  1. 创建一个请求体结构

创建一个请求体的结构体,通过PostRequest函数可以返回一个Post请求的请求体对象,我们只需要把Url和data请求参数传入即可生成一个Post请求的对象

go
复制代码
// HttpRequest 请求体  
type HttpRequest struct {  
    Req *http.Request  
}

// PostRequest 获取一个Post请求对象  
func PostRequest(url string, data io.Reader) *HttpRequest {  
    req, err := http.NewRequest(http.MethodPost, url, data)  
    if err != nil {...}  
    return &HttpRequest{  
        Req: req,  
    }  
}

为HttpRequest创建一个SetHeader方法用于设置请求头中的信息

go
复制代码
// SetHeader 为请求体设置头部参数  
func (req *HttpRequest) SetHeader(key, value string) {  
    req.Req.Header.Set(key, value)  
}

通过测试Header中只需要保留这三个参数即可实现调用

image.png 3. 创建一个HttpUtils工具类

创建HttpUtils工具类,其中有一个httpClient的对象,并为设置其对应的构造函数

go
复制代码
// HttpUtils 工具类结构体  
type HttpUtils struct {  
    client *http.Client  
}  
  
// HttpUtilsConstructor 工具类构造器  
func HttpUtilsConstructor() *HttpUtils {  
    return &HttpUtils{  
        client: &http.Client{},  
    }  
}

创建一个DoRequest函数参数为HttpRequest用于发送请求并返回响应内容

go
复制代码
// DoRequest 执行请求操作,并返回响应数据  
func (utils *HttpUtils) DoRequest(request *HttpRequest) []byte {  
    response, err := utils.client.Do(request.Req)  
    if err != nil {...}  
    defer response.Body.Close()  
    if response.StatusCode != 200 {  
        log.Fatal("请求失败", response)  
        os.Exit(1)  
    }  
    res, err := io.ReadAll(response.Body)  
    if err != nil {...}  
    return res  
}
  1. 设置请求参数 以及 反序列化json字符串

创建一个方法用于设置请求体中的参数,这里感觉不是重点,我就用最简单的字符串拼接实现了。

go
复制代码
// 设置请求参数 参数word为要查找的单词  
func getTranslateRequestData(word string) *strings.Reader {  
    return strings.NewReader(`{"trans_type":"en2zh","source":"` + word + `"}`) 
}

创建方法用于反序列化json字符串

go
复制代码
// JsonUnmarshal 将Json字符串反序列化为ResponseBody  
func JsonUnmarshal(data []byte) *ResponseBody {  
    var res ResponseBody  
    err := json.Unmarshal(data, &res)  
    if err != nil {...}  
    return &res  
}

测试运行

主函数中各个方法调用过程如下,输出的代码就省略了 image.png

  1. 使用go build -o translate main.go命令生成名为translate的可执行文件(MacOS)
  2. 使用./translate WORD命令执行并测试 image.png