概述
用go语言编写的在线字典查询,基于有道词典的api,也是字节青训营第一节课的课后作业之一
使用到的工具:
抓包
进入有道词典页面,右键选择“检查”,输入一个单词进行翻译,在“网络”(或者是“Network”)中找到对应的请求信息
生成请求代码
右键这个刚刚找到的请求,以cURL(bash)的形式复制内容
将复制得到的内容粘贴到curlconverter.com的curl command中,则可以得到转换生成的代码,跟青训班课程不同的是这里的有道词典的翻译请求是一个GET请求
调整请求代码
生成的代码直接复制到你的项目中去
- 请求头部分如果有一些编译错误,可以尝试删除语句,可能不会对代码产生太大影响
- 由于生成的代码请求部分链接报错,我就选择直接找到原先的请求网址复制进去了
运行结果
response 反序列化
将请求的响应内容复制下来,张贴到反序列工具中,得到生成的Go语言结构体
编写代码逻辑
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 路径 单词'