小玩具基本完成之后,在日常工作中,记录一些单词,然后定时再复习下,还真的有那么一点点用(毕竟自己做的小玩具)。
在使用过程中,遇到不认识的单词,总去翻译软件翻译,然后录入中文,这样的话,太繁琐了。可以在录入英文单词的时候,自动从网上查询单词的中文含义,便于录入,或者直接协助录入。
下面我们一步一步来增强小工具的功能
调查API接口
这里简单的查询了翻译api的一些接口,有道的最简单,也不要注册,账户,直接按固定格式去请求,返回的是json,正好使用
这里主要是看了下有道的api接口,返回json,直接用。
http 请求
发起http请求,这里推荐Neget上能一键安装的,vcpkg有些也可以,但是可能跟环境有关,到时候编译可能会失败。这里推荐微软的cpprestsdk。既能熟悉modem C++,又能对微软的ppl了解一点点。
先安装cpprestsdk,Nuget 安装只要点击安装即可
组合起来
api有了,c++发起http请求的库也有了,剩下的就是堆代码了。找一个restsdk 的例子来改,官方网站上是写入http文件,这里直接请求,然后处理json数据,并且最终打印到控制台。
以下是把单词封装成一个异步函数
很简单,chrome 浏览器,把request header 搞出来,对应着撸代码即可。完成了之后再插入模式里面,收到word 候立即启动这个异步任务
关于字符编码的问题
std::cin, win ,的字符编码,为了使用restsdk,可能经常要在各个字符集之间转换
这里举例两个场景,并且给出一般的解决思路:
- http的parameter 是url encode
直接找restsdk的文档,已经有encode的函数,直接拿来用,但是有一点要注意,builder构建的时候会再次编码(默认参数)
- GB2312转UTF-8
这里有两个方法,使用windows 提供的api ,MultiByteToWideChar,WideCharToMultiByte
自行百度
这里推荐使用iconv这个库,方便跨平台。
在windows 上使用iconv有两种方法: 编译链接;dll直接加载的方式
这里简单封装一个dll helper的类
采用模版模式,基类只加载dll文件,在派生类里面提取具体的函数,直接参考iconv的头文件拷贝过来,加上*,以及typef ,最终在定义类的转发函数即可。
关键函数如下
类有了,封装一个函数来使用,直接用GPT 找一个iconv的例子,把对应的函数转换成成员函数
一切都好了,搞个例子跑下看看
来看看最终的效果
再也不用去翻译软件查询单词含义了。