【RLIB】C++调用HttpRequest 、HttpResponse下载远程HTTP/HTTPS资源

来源:互联网 发布:海岛奇兵双弹升级数据 编辑:程序博客网 时间:2024/05/03 02:01
void DownloadFromInternet(const System::String &Url, const System::String &SavePath){//创建 HttpRequest 请求对象  ManagedObject<System::Net::HttpRequest> request =new System::Net::HttpRequest(Url);if (request.IsNull()) {//throw new System::Exception::GetLastException();return;}//初始化HttpRequestrequest->Method    = _T("GET");request->Timeout   = 8000;request->UserAgent = _T("RLib Downloader/4.5 http://rlib.cf/");request->Accept    = _T("text/xml,application/xml,application/xhtml+xml,text/html;*/*");request->Headers.Add("Accept-Charset", "iso-8859-1,utf-8;q=0.7,*;q=0.7");request->Headers.Add("Accept-Language", "zh-cn, zh;q=1.0,en;q=0.5,en;q=0.5,en;q=0.5");request->Headers.Add("Accept-Encoding", "gzip, deflate, x-gzip, identity; q=0.9");//获取远程服务器响应对象  System::Net::HttpResponse *response = request->GetResponse();//自动回收响应对象AutoRunOnce responseFinalizer([](void *response){reinterpret_cast<System::Net::HttpResponse>(response)->Close();}, response);//判断是否出现异常, 出于性能考虑, RLib框架本身并不使用SEH和C++异常处理, 需要自行抛出异常if (!response){RLIB_ALERT(request->GetLastException()->Message);//throw request->GetLastException();return;}if (response->GetLastException()->Id != STATUS_SUCCESS){//通常情况下是网页数据异常RLIB_ALERT(response->GetLastException()->Message);//throw new System::Net::HttpException(*response->GetLastException());return;}//成功 ManagedObject<System::IO::FileStream> output =System::IO::File::Create(SavePath, System::IO::File::CreateNewMode);if (output.IsSatisfied()){//response->GetResponseStream()->CopyTo(output);output->Write(response->GetResponseStream()->ObjectData,  response->GetResponseStream()->Length);//文件IO异常if (output->GetLastException()->Id != STATUS_SUCCESS){RLIB_ALERT(output->GetLastException()->Message);//throw new System::IO::FileException(*response->GetLastException());return;}}}

调用例子:

DownloadFromInternet(_T("http://rlib.cf/images/logo.png"), _T("logo.png"));


或者, 更简单的, 使用封装好的方法:

System::Net::WebClient::DownloadFile(const String &Url, const String &FilePath,    HttpRequest *pRequest IN = nullptr,    HttpResponse **ppResponse OUT = nullptr);