这是我参与「第五届青训营」伴学笔记创作活动的第 12 天
通过之前对于Go语言的学习,我上手学习和完善实战的例子,文本主要内容:在线词典
在线词典
实现一个在线单词查询功能,使用户在命令行里面查询一个单词,我们能调用第三方的API查询到单词的翻译并打印出来。
学习要点:
- 使用Go语言来发送HTTP请求
- 解析JSON信息
- 学会如何使用代码生成来提高开发效率
实现思路
通过go语言发送http请求,获取用户输入英文单词的音标以及汉语解释等信息,并通过fmt.Println函数展示部分翻译内容。
主要难点:
- 翻译网站的网络抓包
- 相关结构体的构造以及相关请求代码的生成
1 基础:接入彩云翻译的api
通过第三方API(彩云翻译)完成我们这个在线词典。
通过这个重要网站(这个http请求需要的字段很少):彩云小译 - 在线翻译 (caiyunapp.com)
步骤:
- F12从“网络”找到dict,它的请求方法是post
- 选择dict,右键进行CURL的复制,用于后面的代码生成
- 选择dict,切换标头到载荷,发现它的请求载荷,用于字典请求的数据结构的构造
- 切换到预览,可以根据返回的预览数据,设置接收的字段,用于字典回复的数据结构的构造
2 代码生成
单纯用代码构造很麻烦,我们可以利用右键复制CURL,然后粘贴到网站Convert curl commands to Go (curlconverter.com),即可快速获取这个请求的 Go 语言写法(将复制的CURL直接转换成go语言对应的代码)。
这一步可以极大地减轻我们对在线词典的创建工作,将生成的代码copy在main.go中,即运行起来就可以看到翻译test的结果。
结果如下,
其中,生成的代码分为创建请求、设置请求头、发起请求、读取响应四部分.
2.1创建请求
使用了标准库中的 http 包来发起一个HTTP POST请求
- 生成的程序先创建了一个 HTTP 客户端,用于向服务器发起请求。
- 一个字符串类型的变量
data,包含了请求体中的数据。这里使用了strings.NewReader函数将数据转换为io.Reader类型的一个流- 目的:
data体积很大时,如果直接读取到内存中会引起很大的内存消耗,而使用流则可以解决这个问题
- 目的:
- 接下来使用
http.NewRequest函数创建了一个请求。- 第一个参数表示请求使用 POST 方法,第二个参数是请求的 URL,第三个参数
data表示请求体中的数据。
- 第一个参数表示请求使用 POST 方法,第二个参数是请求的 URL,第三个参数
- 检查是否有创建请求错误,如果有错误,就会打印错误信息并结束进程。
2.2设置请求头
请求头匹配好即可
2.3发起请求
- 通过
resp, err := client.Do(req)达到发起请求的作用 - 请求完成后使用注册延迟调用的机制,用 defer resp.Body.Close() 关闭连接。
2.4读取响应
- 使用
bodyText, err := ioutil.ReadAll(resp.Body)将响应的流转换为一个 byte 数组,如果此时打印这段代码,可以看到一段 JSON 的代码。 - 根据后面的response对象(字典响应数据结构),用JSON.unmarshal反序列化到结构体
- 至此,http的请求响应就完成了,最后只需要打印结果
3 字典请求的数据结构
由“请求载荷”所构造出来的数据结构,如下所示(为避免序列化首字母大写的问题,后面需要写一个tag来匹配请求载荷需要的字段)
4 字典响应的数据结构
- 理论来说,最好字典响应的结构体字段最好一一对应
- 有一个小技巧的是,网上有对应的代码生成工具,把json字符串粘贴进去,这样我们就能够生成对应结构体。
- 通过将之前生成的代码运行出来的内容复制到网站JSON转Golang Struct - 在线工具 - OKTools,这个网站我们可以将json字符串生成对应的response结构体,我们先定一个response的结构体的对象,然后用JSON.unmarshal把body反序列化到这个结构体里面,之后就可以观察到我们需要的结果了。
- 在某些时刻,我们如果不需要对这个返回结果,做很多精细的操作,我们可以选择转换嵌套,能让生成的代码更加紧凑。
- 结果如下,
选择rc,wiki,dictionary
5 完成http响应后打印结果
打印结果有UK和US的两种音标,与翻译后的中文结果
6 其他平台尝试
总共试验了百度翻译和有道翻译,有道的生成结果代码不行,百度的代码生成的运行结果可以,但只针对于固定的一个单词的翻译,用了别的单词会出现
正常情况:
总结
本文主要剖析了在线词典这个实战项目。通过对这个项目的探究,我温习了 Go 语言基础知识,还加深了对于http的请求与回复的认识,明天继续加油,在学习之余也同样努力去完成任务,详细完善之前的实战和工程的作业任务。
引用
PPT:Go 语言上手 - 基础语法 .pptx - 飞书云文档 (feishu.cn)