THTTPClient 非同期 HTTP リクエスト

  • 0
    いいね
  • 0
    コメント

    THTTPClientを使って非同期HTTPリクエストを試してみました。
    TNetHTTPClientと言うコンポーネントもありますが、TNetHTTPClient classにはTHTTPClientが 内包されています。

    コンソール アプリケーションを新規プロジェクトC++Builder(Win64)で作成しTHTTPClientBeginGet()を試したコードです。

    net_console_1.cpp
    struct _net_request:public TObject
    {
        using inherited = TObject;
        std::mutex m_;
        bool f_wait{false};
        THTTPClient* f_netc_{THTTPClient::Create()};
        String f_temp;
        _net_request():inherited()
        {
            f_netc_->OnReceiveData = receive_event;
        }
        void __fastcall receive_event(TObject * const Sender, __int64 AContentLength, __int64 AReadCount, bool &Abort)
        {
            if (Abort == false)
            {
                std::wcout << L"AReadCount=" << AReadCount << std::endl;
            }
    
        }
        void set_wait(const bool value_)
        {
            std::lock_guard<std::mutex> lk_(m_);
            f_wait = value_;
        }
        bool get_wait()
        {
            std::lock_guard<std::mutex> lk_(m_);
            return f_wait;
        }
        __fastcall ~_net_request(void)
        {
            delete f_netc_;
        }
    };
    
     int _tmain(int argc, _TCHAR* argv[])
    {
        String url_         = argv[1];
        String fname_       = argv[2];
        String path_name_   = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetSharedDownloadsPath(), fname_);
        std::unique_ptr<_net_request> req_ = std::make_unique<_net_request>();
        //
        int lengs_ = req_->f_netc_->Head(url_)->ContentLength;
        std::cout << "ContentLength" << lengs_ << std::endl;
    
        std::unique_ptr<TFileStream> down_file_ = std::make_unique<TFileStream>(path_name_, fmCreate);
        down_file_->Position = 0;
        TDateTime tstart_ = Now();
        _di_IAsyncResult res_= req_->f_netc_->BeginGet([&req_, &tstart_](const System::Types::_di_IAsyncResult AsyncResult)
            {
                req_->set_wait(true);
                TDateTime tend_ = Now() - tstart_;
                std::wcout <<  FormatDateTime("hh:nn:ss.zzz",tend_).w_str() << L" End Download." << std::endl;
            }, url_, down_file_.get());
    
        if (res_ != nullptr)
        {
            // Wait until BeginGet() is over.
            while (! req_->get_wait() )
            {
                std::this_thread::sleep_for(std::chrono::seconds(2));
            }
        }
        return 0;
    }
    

    THTTPClient Delphiを利用した方法

    下記のURLに詳しく書かれています。
    http://qiita.com/pik/items/998547937c7d05d34977

    参考URL

    https://community.embarcadero.com/blogs/entry/thttpclient-http-japan
    https://github.com/mojeld/THTTPClient_Console