Go基础实战——在线词典 | 青训营笔记

152 阅读5分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 12 天

通过之前对于Go语言的学习,我上手学习和完善实战的例子,文本主要内容:在线词典

在线词典

实现一个在线单词查询功能,使用户在命令行里面查询一个单词,我们能调用第三方的API查询到单词的翻译并打印出来。

学习要点:

  1. 使用Go语言来发送HTTP请求
  2. 解析JSON信息
  3. 学会如何使用代码生成来提高开发效率

实现思路

通过go语言发送http请求,获取用户输入英文单词的音标以及汉语解释等信息,并通过fmt.Println函数展示部分翻译内容。

主要难点:

  1. 翻译网站的网络抓包
  2. 相关结构体的构造以及相关请求代码的生成

1 基础:接入彩云翻译的api

通过第三方API(彩云翻译)完成我们这个在线词典。

通过这个重要网站(这个http请求需要的字段很少):彩云小译 - 在线翻译 (caiyunapp.com)

步骤:

  1. F12从“网络”找到dict,它的请求方法是post image.png
  2. 选择dict,右键进行CURL的复制,用于后面的代码生成 image.png
  3. 选择dict,切换标头到载荷,发现它的请求载荷,用于字典请求的数据结构的构造 image.png
  4. 切换到预览,可以根据返回的预览数据,设置接收的字段,用于字典回复的数据结构的构造 image.png

2 代码生成

单纯用代码构造很麻烦,我们可以利用右键复制CURL,然后粘贴到网站Convert curl commands to Go (curlconverter.com),即可快速获取这个请求的 Go 语言写法(将复制的CURL直接转换成go语言对应的代码)。

这一步可以极大地减轻我们对在线词典的创建工作,将生成的代码copy在main.go中,即运行起来就可以看到翻译test的结果。

结果如下, image.png 其中,生成的代码分为创建请求、设置请求头、发起请求、读取响应四部分.

2.1创建请求

使用了标准库中的 http 包来发起一个HTTP POST请求 image.png

  • 生成的程序先创建了一个 HTTP 客户端,用于向服务器发起请求。
  • 一个字符串类型的变量 data,包含了请求体中的数据。这里使用了 strings.NewReader 函数将数据转换为 io.Reader 类型的一个流
    • 目的: data 体积很大时,如果直接读取到内存中会引起很大的内存消耗,而使用流则可以解决这个问题
  • 接下来使用 http.NewRequest 函数创建了一个请求。
    • 第一个参数表示请求使用 POST 方法,第二个参数是请求的 URL,第三个参数 data 表示请求体中的数据。
  • 检查是否有创建请求错误,如果有错误,就会打印错误信息并结束进程。

2.2设置请求头

请求头匹配好即可 image.png

2.3发起请求

  • 通过 resp, err := client.Do(req)达到发起请求的作用
  • 请求完成后使用注册延迟调用的机制,用 defer resp.Body.Close() 关闭连接。

image.png

2.4读取响应

image.png

  • 使用 bodyText, err := ioutil.ReadAll(resp.Body) 将响应的流转换为一个 byte 数组,如果此时打印这段代码,可以看到一段 JSON 的代码。
  • 根据后面的response对象(字典响应数据结构),用JSON.unmarshal反序列化到结构体
  • 至此,http的请求响应就完成了,最后只需要打印结果

3 字典请求的数据结构

由“请求载荷”所构造出来的数据结构,如下所示(为避免序列化首字母大写的问题,后面需要写一个tag来匹配请求载荷需要的字段) image.png

4 字典响应的数据结构

  • 理论来说,最好字典响应的结构体字段最好一一对应
  • 有一个小技巧的是,网上有对应的代码生成工具,把json字符串粘贴进去,这样我们就能够生成对应结构体。
  • 通过将之前生成的代码运行出来的内容复制到网站JSON转Golang Struct - 在线工具 - OKTools,这个网站我们可以将json字符串生成对应的response结构体,我们先定一个response的结构体的对象,然后用JSON.unmarshal把body反序列化到这个结构体里面,之后就可以观察到我们需要的结果了。
  • 在某些时刻,我们如果不需要对这个返回结果,做很多精细的操作,我们可以选择转换嵌套,能让生成的代码更加紧凑。
  • 结果如下, image.png 选择rc,wiki,dictionary image.png

5 完成http响应后打印结果

打印结果有UK和US的两种音标,与翻译后的中文结果 image.png

6 其他平台尝试

总共试验了百度翻译和有道翻译,有道的生成结果代码不行,百度的代码生成的运行结果可以,但只针对于固定的一个单词的翻译,用了别的单词会出现 image.png

正常情况: image.png

总结

本文主要剖析了在线词典这个实战项目。通过对这个项目的探究,我温习了 Go 语言基础知识,还加深了对于http的请求与回复的认识,明天继续加油,在学习之余也同样努力去完成任务,详细完善之前的实战和工程的作业任务。

引用

PPT:‍​​⁢​​⁢‬⁤‍‍‬⁢⁢⁤‌⁤‌​‬‍⁢‬⁣​⁤​⁡⁤​‍⁤⁣‬‌‍⁤‬‍⁣⁡⁡‍‬⁣Go 语言上手 - 基础语法 .pptx - 飞书云文档 (feishu.cn)