在线词典实战学习解析 | 青训营笔记

70 阅读1分钟

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

解析response body

发送出请求后,我们需要解析response body,在JS/Python这些脚本语言中, body是一个字典或者map的结构,可以直接取值,但是golang是一个强类型语言,所以这样做不是一个好的方式。

常用的方法是和request里的一样,写一个结构体,将返回的JSON反序列化到结构体中。

有一个技巧是可以利用网站oktools.net/json2go来通过JSON生成与之匹配的结构体

image.png

解析json传入结构体

var dictResponse DictResponse
err = json.Unmarshal(bodyText, &dictResponse)
if err != nil {
        log.Fatal(err)
}
fmt.Printf("%#v\n", dictResponse)

image.png

打印结果

观察输出的json可知,所需结果在Dictionary.explanations中,我们可以选择使用for range来循环迭代。也可以打印出音标等其他信息。

fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
for _, item := range dictResponse.Dictionary.Explanations {
    fmt.Println(item)
}

到此基本上就算是结束了,可以添加一些优化的内容

检测请求返回情况

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))
}

将请求封装为函数

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)
}

image.png


总结

首先要对使用的信息接口进行抓包,获取请求的接口,这里可以使用浏览器的开发者工具,找到对应的信息的请求,然后复制为curl,使用工具转化为go语言的请求代码。这样就可以通过代码获取返回的JSON。 接下来利用返回的JSON生成go语言对应的结构体,将信息存入结构体中, 查找所需信息按一定格式输出即可。