How do you make a HTTP request with C++?

后端 未结 22 2502
有刺的猬
有刺的猬 2020-11-22 06:25

Is there any way to easily make a HTTP request with C++? Specifically, I want to download the contents of a page (an API) and check the contents to see if it contains a 1 o

22条回答
  •  孤街浪徒
    2020-11-22 07:10

    Here is some code that will work with no need to use any 3rd party library: First define your gateway, user, password and any other parameters you need to send to this specific server.

    #define USERNAME "user"
    #define PASSWORD "your password"
    #define GATEWAY "your gateway"
    

    Here is the code itself:

    HINTERNET hOpenHandle, hResourceHandle, hConnectHandle;
    const TCHAR* szHeaders = _T("Content-Type:application/json; charset=utf-8\r\n");
    
    
    hOpenHandle = InternetOpen(_T("HTTPS"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if (hOpenHandle == NULL)
    {
        return false;
    }
    
    
    hConnectHandle = InternetConnect(hOpenHandle,
        GATEWAY,
        INTERNET_DEFAULT_HTTPS_PORT,
        NULL, NULL, INTERNET_SERVICE_HTTP,
        0, 1);
    
    if (hConnectHandle == NULL)
    {
        InternetCloseHandle(hOpenHandle);
        return false;
    }
    
    
    hResourceHandle = HttpOpenRequest(hConnectHandle,
        _T("POST"),
        GATEWAY,
        NULL, NULL, NULL, INTERNET_FLAG_SECURE | INTERNET_FLAG_KEEP_CONNECTION,
        1);
    
    if (hResourceHandle == NULL)
    {
        InternetCloseHandle(hOpenHandle);
        InternetCloseHandle(hConnectHandle);
        return false;
    }
    
    InternetSetOption(hResourceHandle, INTERNET_OPTION_USERNAME, (LPVOID)USERNAME, _tcslen(USERNAME));
    InternetSetOption(hResourceHandle, INTERNET_OPTION_PASSWORD, (LPVOID)PASSWORD, _tcslen(PASSWORD));
    
    std::string buf;
    if (HttpSendRequest(hResourceHandle, szHeaders, 0, NULL, 0))
    {
        while (true)
        {
            std::string part;
            DWORD size;
            if (!InternetQueryDataAvailable(hResourceHandle, &size, 0, 0))break;
            if (size == 0)break;
            part.resize(size);
            if (!InternetReadFile(hResourceHandle, &part[0], part.size(), &size))break;
            if (size == 0)break;
            part.resize(size);
            buf.append(part);
        }
    }
    
    if (!buf.empty())
    {
        // Get data back
    }
    
    InternetCloseHandle(hResourceHandle);
    InternetCloseHandle(hConnectHandle);
    InternetCloseHandle(hOpenHandle);
    

    That should work on a Win32 API environment.

    Here is an example.

提交回复
热议问题