微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WinHttpSendRequest 持续失败并显示 Windows 错误代码 87、ERROR_INVALID_PARAMETER (C++)

如何解决WinHttpSendRequest 持续失败并显示 Windows 错误代码 87、ERROR_INVALID_PARAMETER (C++)

我正在尝试使用 WinHTTP 通过具有标头和可选的 json 内容的代理发送 http post 请求。我已经尝试了此处问题中概述的解决方案:

WinHttpSendRequest returns ERROR_INVALID_PARAMETER

https://picsum.photos/

然而,它似乎并没有改变任何东西。我在下面粘贴了发布请求功能。也许我错过了一些东西。如果我能做些什么来解决这个问题,请告诉我。

问题区域围绕 WinHttpSendRequest

std::string PostRequest(std::wstring token,std::string json,std::string proxy,std::wstring url,std::wstring domain) {
    std::cout<<"PostRequest function started"<<std::endl;

    std::cout<<"json is being processed"<<std::endl;
    LPSTR  data = (LPSTR)json.c_str();
    DWORD data_len;
    if(data!=0) data_len = strlen(data); else data_len = 0;

    std::cout<<"json done"<<std::endl<<GetLastError()<<std::endl;

    std::string response;

    DWORD dwSize = 0;
    DWORD dwDownloaded = 0;
    LPSTR pszOutBuffer;
    BOOL  bResults = FALSE;
    HINTERNET  hConnect = NULL,hRequest = NULL;

    std::wstring stemp = std::wstring(proxy.begin(),proxy.end());
    const wchar_t* sw = stemp.c_str();

    std::cout<<"initializing WinHttpOpen"<<std::endl<<GetLastError()<<std::endl;

    HINTERNET hSession=WinHttpOpen(L"WinHTTP Example/1.0",WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,L"http://"+*sw,WINHTTP_NO_PROXY_BYPASS,0);

    std::cout<<"initializing WinHttpConnect"<<std::endl<<GetLastError()<<std::endl;

    if(hSession) hConnect = WinHttpConnect(hSession,domain.c_str(),INTERNET_DEFAULT_HTTPS_PORT,0 );

    std::cout<<"initializing WinHttpOpenRequest"<<std::endl<<GetLastError()<<std::endl;

    if(hConnect) hRequest = WinHttpOpenRequest(hConnect,L"POST",url.c_str(),NULL,WINHTTP_NO_REFERER,WINHTTP_DEFAULT_ACCEPT_TYPES,WINHTTP_FLAG_SECURE);

    const wchar_t *additionalHeaders =
        L"Content-Type: application/json\r\n"
        L"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML,like Gecko) Chrome/23.0.1271.64 Safari/537.11\r\n"
        L"Authorization: "+*token.c_str()+*L"\r\n";
    DWORD headersLength = -1;

    std::cout<<"initializing WinHttpSendRequest"<<std::endl<<GetLastError()<<std::endl;
    std::cout<<"bResults: "<<bResults<<std::endl;

    LPVOID rqdata;
    if(data==0)rqdata = WINHTTP_NO_REQUEST_DATA;
    else rqdata=(LPVOID)data;

    if (hRequest) bResults = WinHttpSendRequest(hRequest,additionalHeaders,headersLength,rqdata,data_len,0);
    else std::cout<<"else 1"<<std::endl;

    std::cout<<"bResults: "<<bResults<<std::endl;
    std::cout<<"initializing WinHttpReceiveResponse"<<std::endl<<GetLastError()<<std::endl;

    if (bResults) bResults = WinHttpReceiveResponse(hRequest,NULL);
    else std::cout<<"else 2"<<std::endl;

    std::cout<<"bResults: "<<bResults<<std::endl;

    if (bResults)
        {
            do
            {
                // Check for available data.
                dwSize = 0;
                if (!WinHttpQueryDataAvailable(hRequest,&dwSize))
                    std::cout<<"Error in WinHttpQueryDataAvailable.\n"<<GetLastError();

                // Allocate space for the buffer.
                pszOutBuffer = new char[dwSize + 1];
                if (!pszOutBuffer)
                {
                    printf("Out of memory\n");
                    dwSize = 0;
                }
                else
                {
                    // Read the data.
                    ZeroMemory(pszOutBuffer,dwSize + 1);

                    if (!WinHttpReadData(hRequest,(LPVOID)pszOutBuffer,dwSize,&dwDownloaded))
                        std::cout<<"Error in WinHttpReadData.\n"<<GetLastError();
                    else
                        response = response + std::string(pszOutBuffer);
                    // Free the memory allocated to the buffer.
                    delete[] pszOutBuffer;
                }
            } while (dwSize > 0);
        }
        if (!bResults)
            std::cout<<"Error has occurred.\n"<<GetLastError()<<std::endl;

        if (hRequest) WinHttpCloseHandle(hRequest);
        if (hConnect) WinHttpCloseHandle(hConnect);
        if (hSession) WinHttpCloseHandle(hSession);

        return response;
}

所有的 cout 都是为了调试,稍后我会删除

输出看起来像这样:(对不起,如果有点乱)

PostRequest function started
json is being processed
json done
0
initializing WinHttpOpen
0
initializing WinHttpConnect
0
initializing WinHttpOpenRequest
0
initializing WinHttpSendRequest
0
bResults: 0
bResults: 0
initializing WinHttpReceiveResponse
87
else 2
bResults: 0
Error has occurred.
87

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。