后端项目simpledict学习

89 阅读3分钟

功能

  1. 命令行参数解析:程序通过 os.Args 获取命令行参数,如果参数数量不等于 2,则会输出使用帮助并退出程序。
  2. HTTP 请求:程序使用 http.Client 发送 HTTP POST 请求到彩云小译的 API 端点。
  3. JSON 序列化:请求体使用 json.Marshal 将 DictRequest 结构体序列化为 JSON 格式。
  4. 请求头设置:程序设置了一系列的请求头,包括 Content-TypeAcceptUser-Agent 等,这些请求头是调用 API 所必需的。
  5. 响应处理:程序读取响应体,并检查状态码,如果状态码不是 200,则会输出错误信息并退出程序。
  6. JSON 反序列化:程序使用 json.Unmarshal 将响应体的 JSON 数据反序列化为 DictResponse 结构体。
  7. 结果输出:程序输出翻译后的单词,包括英式发音和美式发音,以及单词的中文解释。

代码结构

  • main.go:包含 main 函数和 query 函数,main 函数负责解析命令行参数并调用 query 函数,query 函数负责发送 HTTP 请求并处理响应。
  • DictRequest 和 DictResponse:这两个结构体分别定义了请求体和响应体的 JSON 格式。

使用方法

在命令行中输入以下命令来使用这个工具:

shellscript

  • Run

simpleDict WORD

其中 WORD 是你想要翻译的英文单词。例如:

shellscript

  • Run

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)

    }

}

代码解释

  1. 创建 HTTP 客户端

    go

    client := &http.Client{}

    创建一个 http.Client 实例,用于发送 HTTP 请求。

  2. 构建请求结构体

    go

    request := DictRequest{TransType: "en2zh", Source: 

    word}

    创建一个 DictRequest 结构体实例,设置 TransType 为 "en2zh",表示英译中,Source 为要翻译的单词。

  3. 序列化请求结构体为 JSON

    go

    buf, err := json.Marshal(request)

    if err!= nil {

        log.Fatal(err)

    }

    使用 json.Marshal 将请求结构体序列化为 JSON 格式,并将结果存储在 buf 中。

  4. 创建 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 请求。

  5. 设置请求头

    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-TypeAcceptUser-Agent 等,这些请求头是调用 API 所必需的。

  6. 发送 HTTP 请求

    go

    resp, err := client.Do(req)

    if err!= nil {

        log.Fatal(err)

    }

    defer resp.Body.Close()

    使用 client.Do