Go语言在线词典——基于有道词典 | 青训营

170 阅读2分钟

概述

用go语言编写的在线字典查询,基于有道词典的api,也是字节青训营第一节课的课后作业之一

使用到的工具:

1.有道词典
2.cURL代码转换器
3.反序列工具


抓包

进入有道词典页面,右键选择“检查”,输入一个单词进行翻译,在“网络”(或者是“Network”)中找到对应的请求信息

image.png

生成请求代码

右键这个刚刚找到的请求,以cURL(bash)的形式复制内容

image.png

将复制得到的内容粘贴到curlconverter.com的curl command中,则可以得到转换生成的代码,跟青训班课程不同的是这里的有道词典的翻译请求是一个GET请求

image.png

调整请求代码

生成的代码直接复制到你的项目中去

  • 请求头部分如果有一些编译错误,可以尝试删除语句,可能不会对代码产生太大影响
  • 由于生成的代码请求部分链接报错,我就选择直接找到原先的请求网址复制进去了

image.png

image.png

运行结果

image.png

response 反序列化

将请求的响应内容复制下来,张贴到反序列工具中,得到生成的Go语言结构体

image.png

image.png

编写代码逻辑

package main  
  
import (  
"encoding/json"  
"fmt"  
"io"  
"log"  
"net/http"  
"os"  
)  
  
type DictResponse struct {  
Result struct {  
Msg string `json:"msg"`  
Code int `json:"code"`  
} `json:"result"`  
Data struct {  
Entries []struct {  
Explain string `json:"explain"`  
Entry string `json:"entry"`  
} `json:"entries"`  
Query string `json:"query"`  
Language string `json:"language"`  
Type string `json:"type"`  
} `json:"data"`  
}  
  
func query(word string) {  
//创建请求  
client := &http.Client{}  
surl := "https://dict.youdao.com/suggest?num=5&ver=3.0&doctype=json&cache=false&le=en&q="  
surl = surl + word  
req, err := http.NewRequest("GET", surl, nil)  
if err != nil {  
log.Fatal(err)  
}  
//设置请求头  
req.Header.Set("Accept", "application/json, text/plain, */*")  
req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")  
req.Header.Set("Connection", "keep-alive")  
req.Header.Set("Cookie", "OUTFOX_SEARCH_USER_ID=-948892295@10.108.160.105; OUTFOX_SEARCH_USER_ID_NCOO=773241823.5552588")  
req.Header.Set("Origin", "https://www.youdao.com")  
req.Header.Set("Referer", "https://www.youdao.com/")  
req.Header.Set("Sec-Fetch-Dest", "empty")  
req.Header.Set("Sec-Fetch-Mode", "cors")  
req.Header.Set("Sec-Fetch-Site", "same-site")  
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")  
req.Header.Set("sec-ch-ua", `"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"`)  
req.Header.Set("sec-ch-ua-mobile", "?0")  
req.Header.Set("sec-ch-ua-platform", `"Windows"`)  
  
//发送请求  
resp, err := client.Do(req)  
if err != nil {  
log.Fatal(err)  
}  
  
//读取响应  
//defer 放置流泄露,函数结束之后从下往上触发  
defer resp.Body.Close()  
bodyText, err := io.ReadAll(resp.Body)  
if err != nil {  
log.Fatal(err)  
}  
  
if resp.StatusCode != 200 {  
log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))  
}  
  
var dictResponse DictResponse  
err = json.Unmarshal(bodyText, &dictResponse) //反序列化  
if err != nil {  
log.Fatal(err)  
}  
  
for _, item := range dictResponse.Data.Entries {  
fmt.Println(item.Entry)  
fmt.Println(item.Explain)  
}  
}  
  
func main() {  
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 run 路径 单词'

image.png