在线词典的实现
使用Go发送http请求,解析JSON,使用代码生成提高开发效率的实践
抓包
- 在我们输入词语,点击翻译,网页返回翻译的过程背后,网站究竟做了什么?:flushed:
- 让我们用开发者工具解剖背后的实现过程
右键网页,选择检查,在弹出的侧栏里选中Network,然后尝试输入一个单词,此时开发者工具会弹出一系列请求,选中dict,
我们看到Headers里表示这是一个POST请求。进一步点开Payload,
发出的JSON里含有我们的请求,比如
{trans_type: "en2zh"}
代表了我们想将英语转换为中文
代码生成
-
使用代码生成工具快速生成请求
- 复制网站的curl
- 将复制到的curl粘贴到工具的输入栏里,
看到下方已经给出了完整的命令
- 对命令的解释
- 行14 创建了一个使用POST方法向对应url发送的请求存储在req
- 行18-36 设置请求头
- 行37 发起请求,获取输入流放在resp
- 行41^ 结束输入流,防止数据泄露
- 行42 将Body部分转成byte数据存入bodyText
- 运行代码,应当能看到返回的JSON数据,
- 复制网站的curl
-
由于我们需要可变的请求,而生成的代码只能生成特定的请求,我们对生成部分代码做更改
- 定义结构体
- 行18 初始化一个request结构体
- 行19 将request转化成byte数组
- 行23 把byte数组转化成data
- 使用工具生成结构体
- 我们用同样的办法找到网站的返回值
- 理论上可以手搓结构体然后UnMarshall——超累的,Ctrl+C然后打开工具(视情况可能要动用第三方工具copy)
此处可以直接用嵌套
- 修改处理输入流的部分
- 行79 将返回的body部分反序列化并填入dictResponse,注意需要**&**才能写入
- 运行代码,应当能看到比上一次长——这么多的返回
- 我们用同样的办法找到网站的返回值
- 修改输入输出部分,完善整个函数
- 修改输出部分为需要的信息
- 更改函数名为query,把硬输入***“good”换成word***
- 最后add一个优雅的main函数
- 行72 判断除了函数名有无有效输入
- 运行试试
成功喵:cat:
- 修改输出部分为需要的信息
通过提供api和正确的结构体,我们就能实现自动向网站发送请求并处理返回的数据. 会不会有更有意思的玩法呢?
今日推荐:没有考试的水课