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

前言

本文是介绍用Go完成一个简易版的在线英语单词查询功用,该功用主要是调用第三方在线Api完成英语单词的翻译功用。

在本文中将使用到以下技术点:json解析、http恳求、获取命令行参数、浏览器网络抓包。

本次选用翻译软件为彩云小译,找了其他网站发现都需求签名┭┮﹏┭┮。

网页抓包

翻开翻译网页,在网页中间右键挑选检查Inspect翻开网页控制台。

输入要查询的单词,在控制台中挑选web这个恳求,如图,能够看到咱们需求的信息在图中的符号5中。

Go实现在线词典| 青训营笔记

代码生成

在恳求单词查询接口,能够看到有许多参数以及恳求头,要是一个一个的写有点麻烦,好在有网站能够根据恳求在线生成代码。

首先在浏览器控制台中,选中接口右键挑选Copy -> Copy as cURL如图。

Go实现在线词典| 青训营笔记

仿制出来的内容如下:

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张贴进去就能得到恳求对应的代码。

生成的代码如下:

Go实现在线词典| 青训营笔记

&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的内容仿制到网站里点击转换-嵌套就能生成对应的结构体。

Go实现在线词典| 青训营笔记

删除无用的字段,得到结果如下:

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)
}

运转一下看下结果:

Go实现在线词典| 青训营笔记

读取参数

接下来是从命令行读取参数,命令行参数能够通过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实现在线词典| 青训营笔记

引证

字节内部课——Go 语言的实战事例

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。