青训营小Demo在线词典的简单封装
按照我自己的理解简单封装了一下在线词典案例
分析过程
- 响应体的设置
省去了一些用不到的字段,只保留需要查找的单词、音标、翻译的内容、词组的使用
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"`
}
- 创建一个请求体结构
创建一个请求体的结构体,通过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中只需要保留这三个参数即可实现调用
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
}
- 设置请求参数 以及 反序列化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
}
测试运行
主函数中各个方法调用过程如下,输出的代码就省略了
- 使用
go build -o translate main.go
命令生成名为translate的可执行文件(MacOS) - 使用
./translate WORD
命令执行并测试