使用C++访问Google API
2008-12-16 08:50
453 查看
Google提供了一套基于SOAP的Web API提供给Web开发人员用于让我们可以更加便利的使用Google提供的服务,诸如相册、日历、文档等。可惜Google官方只提供了.net、JAVA、Python、PHP的库用于辅助编程,并没有提供C++的库。也许Google认为在这种Web开发中利用“原始”的C++着实是一件出力不讨好的事情。诚然 C++有速度上的优势,可是对比相对于高速运转的CPU来说,网络依旧是慢如蜗牛,等待的时间占了绝大多是,提升的性能空间着实有限。再者,C++开发难度高,人力时间成本大,往往为了解决这种小小的Web服务也不需要动用C++这种“牛刀”级别的工具。
但是我们绝对不能说C++就完全不能运用在这里,事实上我们依旧可以利用C++进行访问,尤其是对本地执行环境有严格要求的情形,例如系统服务、嵌入式、无脚本和虚拟机执行环境的情况下,C++就成为了不二选择。本文主要展示的是用WinHTTP和ATL与Google Docs API进行通讯,提供给大家参考。
使用Google API主要思路如下
构造与Google保持连接的SSL连接
获取授权码
构造合适的HTTP请求头
将我们的操作动作与授权码绑定在一起发送给Google
接受处理数据,如果完成则关闭SSL连接,与Google断开
首先解决第一个问题,就是构造SSL连接。我推荐使用OpenSSL或者是WinINet,前者跨平台,后者Windows XP系统及以上系统原生支持。所以如果我们希望跨平台则需要使用OpenSSL,如果仅仅在Windows平台下使用则无需其他辅助网络库。需要注意的是Python标准库中的urllib以及urllib2是原生支持SSL连接的,详细情况请看Python源代码。但是在ATL中并没有直接提供SSL连接的库,CAtlClient并没有加入对HTTPS的支持,所以我们需要手工利用WinINET构造HTTPS连接。示范代码如下,
Code
string AuthHeader("Authorization: GoogleLogin ");
AuthHeader += Result.substr( Result.find("Auth="));//构造验证头
CAtlHttpClient Conn;
CAtlNavigateData NavData;
NavData.SetExtraHeaders(AuthHeader.c_str());//加入刚才构造的头信息
NavData.SetMethod(L"GET");//这里是GET操作
Conn.Navigate("http://docs.google.com/feeds/documents/private/full",&NavData);//获取数据
Conn.Close();
TiXmlDocument XmlDoc;
XmlDoc.Parse((const char*)Conn.GetBody(),NULL,TIXML_ENCODING_UTF8);//如果没错的话可以使用TinyXML库进行结果分析了
Google API的第一步验证是不需要SSL客户验证的。根据Google API的文档说明,用户在使用API的时候需要保持验证连接的进行,所有的请求调用都需要附加上验证信息。Google API返回的所有字符都是UTF8编码,并且将本地ANSI文本上传之后多字节字符如中文将是乱码,所以我们需要将所有预备上传的字符都转换为UTF8格式再上传,否则在Google Docs内部看到的汉字都将是乱码。我们可以用下面的两个函数GBK与UTF8的转换,来自网络搜索,在此对原作者表示感谢,
void ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
void ConvertUtf8ToGBK(CString& strUtf8) {
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len+1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, (LPWSTR)wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, len, NULL,NULL);
strUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
}
所有上传的文本都需要ConvertGBKToUtf8函数转换后再上传,下面是示范代码,
CAtlHttpClient Conn2;
CAtlNavigateData NavData;
NavData.SetExtraHeaders(AuthHeader.c_str());
NavData.SetMethod("POST");
CString SendData("abcd中文dcba");
ConvertGBKToUtf8(SendData);
NavData.SetPostData((BYTE*)SendData.GetBuffer(),SendData.GetLength(),"text/plain")
Conn2.Navigate("http://docs.google.com/feeds/documents/private/full",&NavData);
如果没有出错,此时Conn2的GetBody方法返回的是文件列表,如果没有加入Slug头,上传的文件名默认为Untitled。登录到docs.google.com,看看文件在不在那里了。根据这个思路我们可以访问Google提供的丰富服务而不需要浏览器,一定程度上可以实现自动化,本文仅仅是抛砖引玉,更加详细的实现请到code.google.com查询。
版权所有,转载请联系我。
但是我们绝对不能说C++就完全不能运用在这里,事实上我们依旧可以利用C++进行访问,尤其是对本地执行环境有严格要求的情形,例如系统服务、嵌入式、无脚本和虚拟机执行环境的情况下,C++就成为了不二选择。本文主要展示的是用WinHTTP和ATL与Google Docs API进行通讯,提供给大家参考。
使用Google API主要思路如下
构造与Google保持连接的SSL连接
获取授权码
构造合适的HTTP请求头
将我们的操作动作与授权码绑定在一起发送给Google
接受处理数据,如果完成则关闭SSL连接,与Google断开
首先解决第一个问题,就是构造SSL连接。我推荐使用OpenSSL或者是WinINet,前者跨平台,后者Windows XP系统及以上系统原生支持。所以如果我们希望跨平台则需要使用OpenSSL,如果仅仅在Windows平台下使用则无需其他辅助网络库。需要注意的是Python标准库中的urllib以及urllib2是原生支持SSL连接的,详细情况请看Python源代码。但是在ATL中并没有直接提供SSL连接的库,CAtlClient并没有加入对HTTPS的支持,所以我们需要手工利用WinINET构造HTTPS连接。示范代码如下,
Code
string AuthHeader("Authorization: GoogleLogin ");
AuthHeader += Result.substr( Result.find("Auth="));//构造验证头
CAtlHttpClient Conn;
CAtlNavigateData NavData;
NavData.SetExtraHeaders(AuthHeader.c_str());//加入刚才构造的头信息
NavData.SetMethod(L"GET");//这里是GET操作
Conn.Navigate("http://docs.google.com/feeds/documents/private/full",&NavData);//获取数据
Conn.Close();
TiXmlDocument XmlDoc;
XmlDoc.Parse((const char*)Conn.GetBody(),NULL,TIXML_ENCODING_UTF8);//如果没错的话可以使用TinyXML库进行结果分析了
Google API的第一步验证是不需要SSL客户验证的。根据Google API的文档说明,用户在使用API的时候需要保持验证连接的进行,所有的请求调用都需要附加上验证信息。Google API返回的所有字符都是UTF8编码,并且将本地ANSI文本上传之后多字节字符如中文将是乱码,所以我们需要将所有预备上传的字符都转换为UTF8格式再上传,否则在Google Docs内部看到的汉字都将是乱码。我们可以用下面的两个函数GBK与UTF8的转换,来自网络搜索,在此对原作者表示感谢,
void ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
void ConvertUtf8ToGBK(CString& strUtf8) {
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len+1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, (LPWSTR)wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, len, NULL,NULL);
strUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
}
所有上传的文本都需要ConvertGBKToUtf8函数转换后再上传,下面是示范代码,
CAtlHttpClient Conn2;
CAtlNavigateData NavData;
NavData.SetExtraHeaders(AuthHeader.c_str());
NavData.SetMethod("POST");
CString SendData("abcd中文dcba");
ConvertGBKToUtf8(SendData);
NavData.SetPostData((BYTE*)SendData.GetBuffer(),SendData.GetLength(),"text/plain")
Conn2.Navigate("http://docs.google.com/feeds/documents/private/full",&NavData);
如果没有出错,此时Conn2的GetBody方法返回的是文件列表,如果没有加入Slug头,上传的文件名默认为Untitled。登录到docs.google.com,看看文件在不在那里了。根据这个思路我们可以访问Google提供的丰富服务而不需要浏览器,一定程度上可以实现自动化,本文仅仅是抛砖引玉,更加详细的实现请到code.google.com查询。
版权所有,转载请联系我。
相关文章推荐
- 使用WebService访问Google api
- Google V8 编程入门(二) - 使用c++访问js脚本对象
- 使用WebService访问Google api
- 使用WebService访问Google api
- 使用WebService访问Google api
- 使用WebService访问Google api
- 使用WebService访问Google api
- 使用C++通过ADO访问access数据库的一点问题
- C++使用ocilib访问oracle的函数
- 使用REST API 地图服务无法访问非本地的缓存切片
- 发现一个现在还能使用的访问google的超简易方法
- 转载 Google Maps API Web Services文档使用
- 使用Google API Tool:Infographics生成二维码
- 初识google多语言通信框架gRPC系列(四)C++中使用gRPC
- 使用kubeadm部署k8s集群04-配置kubelet访问kube-apiserver
- C++数据库API操作mysql数据库的使用
- ASP.NET Core的身份认证框架IdentityServer4(8)- 使用密码认证方式控制API访问
- 如何使用 API 从 VisualBasic 访问高级控件
- 使用Google Chart API绘制组合图