简易字典实现|青训营笔记

219 阅读3分钟

GO语言基础实战——simpledict

介绍

命令行词典:通过调用第三方的API查询到单词的翻译,并且打印翻译、音标等信息

案例

通过GO语言,发送http请求,解析JSON,(代码生成,提高效用)

1.抓包——API彩云翻译

任意翻译单词,打开开发者工具,在NetWork-All中,找到Name = dict(找Headers中,Request Method = POSTdict),其PayloadPreview分别为:

image.png

image.png

在选择的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代码,运行结果如下:

image.png

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结构体,并完成上述步骤:

image.png

4.筛选输出信息 + 修改输入

根据反序列化得到的结构体和我们所需要输出的信息,修改输出。

将上述功能转换成函数之后,在main函数中,添加输入功能,从而实现完整功能。

image.png