功能
- 命令行参数解析:程序通过
os.Args获取命令行参数,如果参数数量不等于 2,则会输出使用帮助并退出程序。 - HTTP 请求:程序使用
http.Client发送 HTTP POST 请求到彩云小译的 API 端点。 - JSON 序列化:请求体使用
json.Marshal将DictRequest结构体序列化为 JSON 格式。 - 请求头设置:程序设置了一系列的请求头,包括
Content-Type、Accept、User-Agent等,这些请求头是调用 API 所必需的。 - 响应处理:程序读取响应体,并检查状态码,如果状态码不是 200,则会输出错误信息并退出程序。
- JSON 反序列化:程序使用
json.Unmarshal将响应体的 JSON 数据反序列化为DictResponse结构体。 - 结果输出:程序输出翻译后的单词,包括英式发音和美式发音,以及单词的中文解释。
代码结构
main.go:包含main函数和query函数,main函数负责解析命令行参数并调用query函数,query函数负责发送 HTTP 请求并处理响应。DictRequest和DictResponse:这两个结构体分别定义了请求体和响应体的 JSON 格式。
使用方法
在命令行中输入以下命令来使用这个工具:
shellscript
simpleDict WORD
其中 WORD 是你想要翻译的英文单词。例如:
shellscript
simpleDict hello
程序会输出 hello 的中文翻译以及英式和美式发音。
总结
这个命令行翻译工具展示了如何使用 Go 语言编写一个简单的 HTTP 客户端,以及如何处理 JSON 数据。它可以作为一个基础示例,帮助开发者学习如何使用 Go 语言进行网络编程和数据处理。
以下是代码的详细解释:
go
func query(word string) {
client := &http.Client{}
request := DictRequest{TransType: "en2zh",
Source: word}
buf, err := json.Marshal(request)
if err!= nil {
log.Fatal(err)
}
var data = bytes.NewReader(buf)
req, err := http.NewRequest("POST", "https://
api.interpreter.caiyunai.com/v1/dict", data)
if err!= nil {
log.Fatal(err)
}
req.Header.Set("Connection", "keep-alive")
req.Header.Set("DNT", "1")
req.Header.Set("os-version", "")
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("User-Agent", "Mozilla/5.0
(Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/
537.36 (KHTML, like Gecko) Chrome/99.0.4844.51
Safari/537.36")
req.Header.Set("app-name", "xy")
req.Header.Set("Content-Type", "application/
json;charset=UTF-8")
req.Header.Set("Accept", "application/json,
text/plain, /")
req.Header.Set("device-id", "")
req.Header.Set("os-type", "web")
req.Header.Set("X-Authorization",
"token:qgemv4jr1y38jyq6vhvi")
req.Header.Set("Origin", "https://fanyi.
caiyunapp.com")
req.Header.Set("Sec-Fetch-Site", "cross-site")
req.Header.Set("Sec-Fetch-Mode", "cors")
req.Header.Set("Sec-Fetch-Dest", "empty")
req.Header.Set("Referer", "https://fanyi.
caiyunapp.com/")
req.Header.Set("Accept-Language", "zh-CN,zh;q=0.
9")
req.Header.Set("Cookie",
"_ym_uid=16456948721020430059;
_ym_d=1645694872")
resp, err := client.Do(req)
if err!= nil {
log.Fatal(err)
}
defer resp.Body.Close()
bodyText, err := ioutil.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)
}
fmt.Println(word, "UK:", dictResponse.
Dictionary.Prons.En, "US:", dictResponse.
Dictionary.Prons.EnUs)
for _, item := range dictResponse.Dictionary.
Explanations {
fmt.Println(item)
}
}
代码解释
-
创建 HTTP 客户端:
go
client := &http.Client{}
创建一个
http.Client实例,用于发送 HTTP 请求。 -
构建请求结构体:
go
request := DictRequest{TransType: "en2zh", Source:
word}
创建一个
DictRequest结构体实例,设置TransType为 "en2zh",表示英译中,Source为要翻译的单词。 -
序列化请求结构体为 JSON:
go
buf, err := json.Marshal(request)
if err!= nil {
log.Fatal(err)
}
使用
json.Marshal将请求结构体序列化为 JSON 格式,并将结果存储在buf中。 -
创建 HTTP 请求:
go
var data = bytes.NewReader(buf)
req, err := http.NewRequest("POST", "https://api.
interpreter.caiyunai.com/v1/dict", data)
if err!= nil {
log.Fatal(err)
}
使用
bytes.NewReader创建一个新的io.Reader,并使用它来创建一个新的 HTTP POST 请求。 -
设置请求头:
go
req.Header.Set("Connection", "keep-alive")
req.Header.Set("DNT", "1")
req.Header.Set("os-version", "")
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("User-Agent", "Mozilla/5.0
(Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.
36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/
537.36")
req.Header.Set("app-name", "xy")
req.Header.Set("Content-Type", "application/json;
charset=UTF-8")
req.Header.Set("Accept", "application/json, text/
plain, /")
req.Header.Set("device-id", "")
req.Header.Set("os-type", "web")
req.Header.Set("X-Authorization",
"token:qgemv4jr1y38jyq6vhvi")
req.Header.Set("Origin", "fanyi.caiyunapp.
com")
req.Header.Set("Sec-Fetch-Site", "cross-site")
req.Header.Set("Sec-Fetch-Mode", "cors")
req.Header.Set("Sec-Fetch-Dest", "empty")
req.Header.Set("Referer", "fanyi.caiyunapp.
com/")
req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
req.Header.Set("Cookie",
"_ym_uid=16456948721020430059; _ym_d=1645694872")
设置一系列的请求头,包括
Content-Type、Accept、User-Agent等,这些请求头是调用 API 所必需的。 -
发送 HTTP 请求:
go
resp, err := client.Do(req)
if err!= nil {
log.Fatal(err)
}
defer resp.Body.Close()
使用
client.Do