这是我参加「第五届青训营 」伴学笔记创作活动的第 3 天
前言
本文是介绍用Go完成一个简易版的在线英语单词查询功用,该功用主要是调用第三方在线Api完成英语单词的翻译功用。
在本文中将使用到以下技术点:json
解析、http
恳求、获取命令行参数、浏览器网络抓包。
本次选用翻译软件为彩云小译,找了其他网站发现都需求签名┭┮﹏┭┮。
网页抓包
翻开翻译网页,在网页中间右键挑选检查
或Inspect
翻开网页控制台。
输入要查询的单词,在控制台中挑选web
这个恳求,如图,能够看到咱们需求的信息在图中的符号5
中。

代码生成
在恳求单词查询接口,能够看到有许多参数以及恳求头,要是一个一个的写有点麻烦,好在有网站能够根据恳求在线生成代码。
首先在浏览器控制台中,选中接口右键挑选Copy
-> Copy as cURL
如图。

仿制出来的内容如下:
curl 'https://api.interpreter.caiyunai.com/v1/dict' \
-H 'authority: api.interpreter.caiyunai.com' \
-H 'accept: application/json, text/plain, */*' \
-H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7' \
-H 'app-name: xy' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json;charset=UTF-8' \
-H 'device-id: ' \
-H 'origin: https://fanyi.caiyunapp.com' \
-H 'os-type: web' \
-H 'os-version: ' \
-H 'pragma: no-cache' \
-H 'referer: https://fanyi.caiyunapp.com/' \
-H 'sec-ch-ua: "Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36' \
-H 'x-authorization: token:qgemv4jr1y38jyq6vhvi' \
--data-raw '{"trans_type":"en2zh","source":"hello"}' \
--compressed
翻开代码生成网址,将仿制的cURL
张贴进去就能得到恳求对应的代码。
生成的代码如下:

&http.Client{}
为创立一个httpclient
,创立的时候能够指定一些参数,比方超时时刻等,不指定便是不限制时刻。
http.NewRequest
创立一个http
恳求,参数为恳求方法(GET
/POST
)、恳求URL
以及恳求参数。
req.Header.Set
设置恳求头参数,有些参数不是必须的话能够删掉。
client.Do
建议恳求并回来内容以及错误信息。
resp
为恳求呼应流,为了防止资源泄露,需求对流进行关闭。
defer
一般用于资源的开释和异常的捕捉, defer
句子会将其后面跟从的句子进行推迟处理,将会在程序进行最终的return
之后再履行。如果一个函数中有多个defer
的话,会从下往上履行,也便是最终被defer
的句子,最早被履行。
JSON转化
由于恳求得到的内容是个字符串,并且有许多不需求的信息,接下来便是要把得到的字符串转为JSON
。
需求定义一个结构体与恳求后的response
来对应起来用来接收数据,通过JSON
反序列化到结构体里即可。
由于response
回来的数据十分多并且杂乱,自己书写起来很容易犯错,所以咱们能够通过在线生成代码东西来协助咱们生成代码。
JSON转结构体东西
翻开这个网站,把浏览器response
的内容仿制到网站里点击转换-嵌套
就能生成对应的结构体。

删除无用的字段,得到结果如下:
type DictResp struct {
Dictionary struct {
Prons struct {
EnUs string `json:"en-us"`
En string `json:"en"`
} `json:"prons"`
Explanations []string `json:"explanations"`
} `json:"dictionary"`
}
接下来是对恳求呼应体进行JSON反序列化:
var dictResp DictResp
err = json.Unmarshal(bodyText, &dictResp)
if err != nil {
log.Fatal(err)
}
fmt.Println(word, "UK:", dictResp.Dictionary.Prons.En, "US:", dictResp.Dictionary.Prons.EnUs)
for _, item := range dictResp.Dictionary.Explanations {
fmt.Println(item)
}
运转一下看下结果:

读取参数
接下来是从命令行读取参数,命令行参数能够通过os.Args来获取。
下面来看一个简单例子:
func main() {
fmt.Println(os.Args)
}
通过go run main.go hello
运转,能够获得两个参数,一个是临时履行途径,另一个是自己输入的参数hello
,如下:
[/var/folders/tk/gcvj01wx7m92km/T/go-build446/b001/exe/main hello]
获取参数代码如下:
func main() {
// 判别参数的数量要为2个,否则提示错误
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello`)
os.Exit(1)
}
word := os.Args[1]
query(word)
}
完好代码
好了,到目前为止一个查单词的软件就完成了,完好的代码就不贴出来了,已经放到码上了。
引证
字节内部课——Go 语言的实战事例