go语言初试在线字典,简单练手项目却也调了好几次,记录一下过程及我出现的错误
(我的环境是 win10 + vscode + 谷歌浏览器)
在开始之做之前,先简单了解一下在线词典大概的功能:我们需要在命令行输入代码运行的命令,和想要翻译的英文单词。然后这个它就会顺着网址去到彩云词典翻译,然后将翻译的结果返回并在终端显示出来。当然,这样的代码我不会写。
首先,我们只需在彩云字典的页面按下 F12 ,network 的找出那个数据包 “dict” 。右键它 copy as curl(bash)。去工具网站转化一下(网址:curlconverter.com/go/),很快啊,得到了一段go代码。这个地方我出错了,当我运行代码,得到的是不到一行的JSON,这很显然不能翻译成go代码,错误原因很简单,我在copy时,点击了copy as all curl(bash)选项。后序改正就好了
主要的流程就是:创建请求、设置请求头,发起请求,读取响应
代码很简洁,直接调用 http.NewRequest 方法,跟上请求类型和网址,数据,返回值直接赋给 req,req都不用其声明类型
//想要发送的数据可能比较庞大,使用strings.NewReader 转为只读流,给到后续的方法
var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
发起请求就直接 client.Do,简便的很
resp, err := client.Do(req)
此时运行代码后,词典就能正常返回数据了,不过是一段JSON串,且只能对我们写死的单词good进行处理。我们需要进一步改进代码...
首先是对于输入输出的数据做一点规范,定义两个结构体,
在另一个网站(oktools.net/json2go),把刚才返回的JSON转Golang Struct,这里自己转义的结构体和示例代码的不一样,短了许多,不知道正确与否,试试再说。
定义好两个结构体,我们将数据反序列化到自定义的结构体对象中
json.Unmarshal(bodyText, &dictResponse)
随后取出对应的结果,也就是dictResponse结构体中的 Dictionary.Explanations
使用for循环即可,运行代码查看最终结果
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>The browser (or proxy) sent a request that this server could not understand.</p>
exit status 1
很显然错了,仔细看错误提示,他很明确的告诉我是因为浏览器不能识别你发的数据,
那就回到前面,发现我还是使用之前的方法,将数据使用 strings.NewReader,处理为一个流,但是应该将其序列化为JSON,在将这个JSON读到data中
client := &http.Client{}
// var data = strings.NewReader(`{"trans_type":"en2zh","source":word}`)
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)
再次运行,成功了
hello UK: [ˈheˈləu] US: [həˈlo]
int.喂;哈罗
n.引人注意的呼声
v.向人呼(喂)