GOD:一个 REST Windows 库中访问 Google、Onedrive 和 Dropbox!






4.67/5 (10投票s)
C++ 目录、上传、下载和管理库
GOD 类现在是我 RGF 库 的一部分。
引言
现在是时候使用我优秀的 REST 库 了。这是一个简单而强大的库,提供了一个抽象类来使用 Google Drive、OneDrive 和 DropBox 服务。我在自己的 BAR 应用程序中使用它们。
背景
在本文中,我对已知元素使用了一些简单的扩展,例如 ystring
(一个可以返回 UTF-8 中的 ANSI string
的 wstring
)、TEVENT<>
(一个 HEVENT
上的包装器) 和 XSOCKET
, 一个支持 SSL 的 SOCKET 包装器 - 所有这些都易于理解和使用,它们将在后面的文章中讨论或在之前的文章中讨论过。此外,还使用了 Hong Jiang 的 jsonxx
库。
您只需要将 god.h 以及 jsonxx.h、sync.h、rest.h、xsocket.h 和 ystring.h 包含到您的项目中。
zip 文件包含一个解决方案,您可以取消注释 main.cpp 行来下载和上传文件。
抽象 DRIVE 类
整个东西都基于一个名为 DRIVE
的抽象类,它是我的 REST
类的后代
class DRIVE : public REST
{
protected:
ystring cid;
ystring secret;
jsonxx::Object j;
int port = 9932;
TEVENT<> ev;
XSOCKET x;
vector<char> nd;
public:
DRIVE(const char* ccid = 0, const char* ssid = 0,int HostPort = 9932)
{
SetClient(ccid, ssid,HostPort);
}
virtual void SetClient(const char* ccid = 0, const char* ssid = 0,int HostPort = 9932)
{
if (ccid)
cid = ccid;
if (ssid)
secret = ssid;
port = HostPort;
}
virtual string jsonreturn(ihandle& r)
{
vector<char> out;
ReadToMemory(r, out);
out.resize(out.size() + 1);
char* p = (char*)out.data();
return p;
}
virtual int Auth(vector<string>&) = 0;
virtual string CreateFolder(const char* fn,const char*pid) = 0;
virtual string GetRootFolderID() = 0;
virtual string IDFromPath(const char* Path,bool CreateIfNotExists = false) = 0;
virtual string dir(const char* Path = 0,bool IsRDir = false) = 0;
virtual string ItemProps(const char* id) = 0;
virtual string SetProperty(const char* id, const char* n, const char* v) = 0;
virtual HRESULT Download(const char* fid, HANDLE hF, vector<char>* arr,
unsigned long long from = 0, unsigned long long to = (unsigned long long) - 1,
std::function<HRESULT(unsigned long long, unsigned long long, void*)> fx = 0,
void* lp = 0) = 0;
virtual HRESULT Upload(bool Resumable,HANDLE hX, vector<char>* arr,
const char* folderid, const char* filename, string& resumedata,string&
returndata,std::function<HRESULT(unsigned long long f, unsigned long long t,
void* lp)> fx = 0, void* lp = 0) = 0;
virtual string Delete(const char *rp,const char* fid, bool Trash = false) = 0;
virtual HRESULT HashItem(const char* id, string& Hash, ALG_ID& HashAlg) = 0;
};
构造函数
所有这些库的问题在于,它们需要用户手动“OK”才能首次允许访问,并且必须通过浏览器完成。因此,每个构造函数都接受“客户端 ID”和“客户端密钥”参数以及一个临时 Web 服务器正在监听的 TCP 端口。
DRIVE(const char* ccid = 0, const char* ssid = 0,int HostPort = 9932);
身份验证
virtual int Auth(vector<string>&);
您将一个 vector<string>
传递给此函数,其中包含身份验证令牌值。如果是第一次,则传递一个空向量。返回时,此函数返回
- 0 - 失败。库使用结束
- 1 - 成功
- 2 - 成功,已收到新令牌,您现在应该保存此向量的内容以供将来使用。
通常,会返回一个访问令牌、一个刷新令牌和一个代码。第一次调用 Auth()
将创建一个侦听套接字,然后打开一个带有授权 URL 的网页,供用户单击“我接受”,然后,一个代码将返回到应用程序,该代码随后用于声明访问令牌。
文件和文件夹
在 Google Drive 和 OneDrive 中,文件和文件夹由 ID 表示,而在 Dropbox 中,文件由文件名表示。为了确保兼容性,该库使用“id
”命名,无论如何。
获取信息
string IDFromPath(const char* Path,bool CreateIfNotExists = false);
此函数从给定的路径名返回 ID。如果此项不存在并且 CreateIfNotExists
为 true
,则该函数在该路径下创建一个目录。
string GetRootFolderID();
此函数返回 "root" 文件夹的 ID
。
string dir(const char* Path = 0,bool IsRDir = false);
此函数返回给定路径的目录(作为 json 字符串)。如果 IsRDir
为 true
,则假定 Path
为 ID(如果不是,则使用函数 IDFromPath
将路径转换为 ID)。
创建文件夹
virtual string CreateFolder(const char* fn,const char*pid);
在具有 ID pid
的父目录上创建一个具有给定文件名的文件夹。成功后返回描述性的 json。
删除项目
string Delete(const char *rp,const char* fid, bool Trash = false);
删除一个项目。在 Google 和 OneDrive 中,仅使用第二个参数(ID),而在 DropBox 中,仅使用第一个参数(路径)。如果文件要发送到回收站,则 Trash
为 true
。
当您使用 Trash
设置为 false
调用 ONEDRIVE::Delete
或 DROPBOX::Delete
时,将返回 E_NOTIMPL
。这些驱动器仅允许从 API 回收,不允许直接删除。
哈希项目
HRESULT HashItem(const char* id, string& Hash, ALG_ID& HashAlg);
哈希一个远程项目(仅 Google Drive),返回一个 CALG_MD5 string
。
下载数据
HRESULT Download(const char* fid, HANDLE hF, vector<char>* arr,
unsigned long long from = 0, unsigned long long to = (unsigned long long) - 1,
std::function<HRESULT(unsigned long long, unsigned long long, void*)> fx = 0,
void* lp = 0) = 0;
接受的参数为
- 要下载的文件的 ID
- 用于保存到文件的 HANDLE 或用于保存到缓冲区的
vector<char>
- from/to,下载范围(传递
0,-1
以获取整个流) - 进度回调及其参数
此函数下载指定的项目。
上传数据
HRESULT Upload(bool Resumable,HANDLE hX, vector<char>* arr,const char* folderid,
const char* filename, string& resumedata,string& returndata,std::function<HRESULT
(unsigned long long f, unsigned long long t, void* lp)> fx = 0, void* lp = 0) = 0;
接受的参数为
- 一个标志,指示是否应支持可恢复的上传(仅 Google Drive)
- 一个句柄或一个用于读取数据的向量
- 父文件夹的 ID
- 新文件名
- 进度回调及其参数。
此函数上传数据。
对于 Google Drive,您可以使用 UploadOnce()
HRESULT UploadOnce(HANDLE hX, vector<char>* arr, const char* folderid,
const char* filename, string& returndata, std::function<HRESULT
(unsigned long long f, unsigned long long t, void* lp)> fx = 0, void* lp = 0)
或者您可以使用 BeginResumable()
HRESULT BeginResumable(HANDLE hX, vector<char>* arr, const char* folderid,
const char* filename, string& returndata, string& resumedata,std::function<HRESULT
(unsigned long long f, unsigned long long t, void* lp)> fx = 0, void* lp = 0);
如果此函数失败,可能会返回与恢复相关的数据。在这种情况下,您可以再次调用 ContinueResumable()
HRESULT ContinueResumable(HANDLE hX, vector<char>* arr, const char* folderid,
const char* filename, string& returndata, string& resumedata,
std::function<HRESULT(unsigned long long f, unsigned long long t, void* lp)> fx = 0,
void* lp = 0);
它可以恢复上传。
历史
- 2017-2-3:首次发布