使用go实现在线词典
Step 1: 抓包
通过preview,确定cURL,在terminal中运行,成功返回一串json
Step 2: 代码生成
使用curlconverter 工具,通过cURL生成代码(curlconverter.com/go/)
生成的代码包括一下几个部分
- 创建请求
req, err := http.NewRequest("POST", "<https://fanyi.baidu.com/sug>", data)
- 设置请求头
req.Header.Set("Accept", "application/json, text/javascript, */*; q=0.01")
req.Header.Set("Accept-Language", "en-US,en;q=0.9")
- 发起请求
resp, err := client.Do(req)
- 读取响应
bodyText, err := io.ReadAll(resp.Body)
如果发起请求时由于DNS解析失败或者断网,则返回的err不是nil,会直接退出进程
拿到response之后第一时间使用defer手动关闭这个流,避免资源泄露
defer会在函数结束之后由下至上触发
Step 3: 运行之后,成功打印出JSON,但是还未能实现可变输入
需要用到JSON序列化 → 构造相应结构体 → 初始化结构体变量各个字段→ 使用json.Marshal(request) 序列化返回bytes数组,不是真正字符串
Step 4: 解析response body (反序列化)
也需要构造结构体,再进行反序列化
手动一一对应构造结构体繁琐且容易出错——解决方法:使用json to go工具(oktools.net/json2go)
将浏览器中preview的json字符串copy到网页中,转换生成,转换嵌套,可以使生成的结构体更加简洁
- 创建新的DictResponse变量
- 使用
json.Unmarshal(bodyText, &dictResponse)进行反序列化 - 注意要在
dictResponse前加&符号,才能写入这个结构体 - 使用
fmt.Printf("%#v\n", dictResponse)来打印response,"%#v\n"是打印最详细的结果 - 可以只打印我们想要展示的字段
- 展示报文,方便诊断问题
if resp.StatusCode != 200 {
log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))
}
- 输入的字符串通过query函数的参数传进来
- 新的main函数