GO语言基础实战——simpledict
介绍
命令行词典:通过调用第三方的API查询到单词的翻译,并且打印翻译、音标等信息
案例
通过GO语言,发送http请求,解析JSON,(代码生成,提高效用)
1.抓包——API彩云翻译
任意翻译单词,打开开发者工具,在NetWork-All中,找到Name = dict(找Headers中,Request Method = POST的dict),其Payload和Preview分别为:
在选择的dict上,右键COPY(注:我是Windows系统,选择的是Cpoy as cURL(bash)),利用代码生成网址,将cURL请求自动生成代码
成功:可打印出访问的JSON
2.序列化JSON
上述过程中,需要翻译的单词不能由我们自己控制输入,下面需要解决这个问题。
-
构造结构体
type DictRequest struct { TransType string `json:"trans_type"` Source string `json:"source"` UserID string `json:"user_id"` } -
手动更改请求的变量(需翻译的单词)
client := &http.Client{} // 创建请求 request := DictRequest{TransType: "en2zh", Source: "good"} // 初始化结构体 buf, err := json.Marshal(request) // 序列化 返回的是bytes的数组,不是字符串 if err != nil { log.Fatal(err) } var data = bytes.NewReader(buf) // 此处因为上面,需要用bytes // 创建post请求 req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data) if err != nil { log.Fatal(err) } // 下面同之前生成的代码 ...
成功:由于翻译的单词同上,所以结果不变
3.解析—反序列化
由于打印出来的JSON不易观看,并且很难得到想要的信息,因此我们需要自己定义结构体,来反序列化JSON,使得打印的信息更加美观。
将打印出来的JSON(复制成一行)通过JSON转换工具,自动生成结构体,将其添加到第2步的代码中,
// 为了与课程代码同步,将结构体的名称改为 DictResponse
type AutoGenerated struct {
Rc int `json:"rc"`
Wiki struct {
KnownInLaguages int `json:"known_in_laguages"`
Description struct {
Source string `json:"source"`
Target interface{} `json:"target"`
} `json:"description"`
ID string `json:"id"`
Item struct {
Source string `json:"source"`
Target string `json:"target"`
} `json:"item"`
ImageURL string `json:"image_url"`
IsSubject string `json:"is_subject"`
Sitelink string `json:"sitelink"`
} `json:"wiki"`
Dictionary struct {
Prons struct {
EnUs string `json:"en-us"`
En string `json:"en"`
} `json:"prons"`
Explanations []string `json:"explanations"`
Synonym []string `json:"synonym"`
Antonym []string `json:"antonym"`
WqxExample [][]string `json:"wqx_example"`
Entry string `json:"entry"`
Type string `json:"type"`
Related []interface{} `json:"related"`
Source string `json:"source"`
} `json:"dictionary"`
}
并在main最后添加反序列化代码:
var dictResponse DictResponse
err = json.Unmarshal(bodyText, &dictResponse) // 反序列化
if err != nil {
log.Fatal(err)
}
fmt.Printf("%#v\n", dictResponse)
4.筛选输出需要信息 + 修改输入
根据反序列化得到的结构体和我们所需要输出的信息,修改输出。
将上述功能转换成函数之后,在main函数中,添加输入功能,从而实现完整功能。
实战—火山翻译
1.抓包
由于之前没有经验,寻找curl的过程和前面也有所不同,其中name = ?msToken=&X-Bogus=DFSzswVLQDc7EiQrSWHqMBt/pLfT&_si…UUmpNWfYRxC4ZPRDyR2g86G4cF0YERpolRvJzfKFpMIdf4v00(可能name不同,但是url大同小异,我找到url中有dict字段)
重复步骤之后,将curl生成Go代码,运行结果如下:
2.序列化JSON
同上述操作,创建HuoshanRequest
type HuoshanRequest struct {
Text string `json:"text"`
Language string `json:"language"`
}
将data用结构体表示
client := &http.Client{}
// var data = strings.NewReader(`{"text":"good","language":"en"}`)
request := HuoshanRequest{Text: "good", Language: "en"}
buf, err := json.Marshal(request)
if err != nil {
log.Fatal(err)
}
...
结果同上
3.反序列化
将JSON利用JSON转换工具自动生成Go结构体,并完成上述步骤:
4.筛选输出信息 + 修改输入
根据反序列化得到的结构体和我们所需要输出的信息,修改输出。
将上述功能转换成函数之后,在main函数中,添加输入功能,从而实现完整功能。