这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

这次将记录 在线词典 等功能

需要做的有:
1、得到客户发送HTTP请求(post)到服务器的代码
2、将翻译对象、类型转换为json,用于发送post请求
3、解析返回的数据
4、从解析后的数据得到我们需要的音标、翻译等
复制代码

1、得到客户发送HTTP请求(post)到服务器的代码

在翻译网页的找到post类型的dict

image.png

这个dict便包含所需发送http请求的代码

image.png

随后复制这个dict

image.png

在网页 curlconverter.com/go/ 转换为golang支持的代码并复制到编译器中

image.png

2、将翻译对象、类型转换为json,用于发送post请求

将用红线的代码data替换为bytes的只读流image.png

具体方法如下

首先转为json,goz中 JSON 操作非常简单,只要保证某个结构体每个字段的第一个字母是大写,也就是public。
那么这个结构体就能用 JSON.marshaler 去序列化,变成一个 JSON 的字符串。
序列化之后的字符串也能够用 JSON.unmarshaler 去反序列化到一个空的变量里面。
复制代码

于是构造一个与data对应的结构体,创建一个对象request,其TransType为en2zh,Source为变量word,word是输入的英文。

image.png

type DictRequest struct {
   TransType string `json:"trans_type"`
   Source    string `json:"source"`
   UserID    string `json:"user_id"`
}

//随后将request用json.Marshal序列化变成json字符串buf,再把buf转成只读bytes流data
//如下
func main() {
   var 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)
复制代码

3、解析返回的数据

通过以上两步后,程序是可运行的,打印出的便是服务端返回的json数据
我们需要把这些数据解析
同理,构造一个对应的结构体,并反序列化就是最终需要的数据
复制代码

构造对应结构体

这里需要用到网址 https://oktools.net/json2go 将翻译网页中同一个dict预览,
也就是返回的数据的json类型,如下图
复制代码

image.png

将蓝色框内的其复制后并粘贴到网址中,选择任意一个复制到编译器内
复制代码

image.png

解析服务端返回的json

通过JSON.unmarshaler反序列化得到先前构造的结构体类型的数据。

DictResponsedictresponsedictresponse
var dictresponse DictResponse
err = json.Unmarshal(bodyText, &dictresponse)
if err != nil {
   log.Fatal(err)
}
复制代码

打印出这个dictresponse,如图

image.png

4、从解析后的数据得到我们需要的音标、翻译等

fmt.Println("\n", request.Source, "\n", "UK:", dictresponse.Dictionary.Prons.En, "US:", dictresponse.Dictionary.Prons.EnUs)
//以上为获取音标,以下为得到翻译
for _, item := range dictresponse.Dictionary.Explanations {
   fmt.Println(item)
}
复制代码

最后输出如下图

image.png