12

WinInet を使用して HTTPS GET リクエストを送信したいと考えています。私の知る限り、INTERNET_DEFAULT_HTTPS_PORTINTERNET_FLAG_SECUREフラグを使用する必要があることを除いて、HTTP 要求を送信するのと同じように行う必要があります。

だからここに私が試したものがあります:

#include "stdafx.h"
#include <string>
#include <windows.h>
#include <WinInet.h>

#pragma comment (lib, "Wininet.lib")

using namespace std;


// convert string
wstring CharPToWstring(const char* _charP)
{
    return wstring(_charP, _charP + strlen(_charP));
}

// send https request
wstring SendHTTPSRequest_GET(const wstring& _server,
                             const wstring& _page,
                             const wstring& _params = L"")
{
    char szData[1024];

    // initialize WinInet
    HINTERNET hInternet = ::InternetOpen(TEXT("WinInet Test"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    if (hInternet != NULL) 
    {
        // open HTTP session
        HINTERNET hConnect = ::InternetConnect(hInternet, _server.c_str(), INTERNET_DEFAULT_HTTPS_PORT, NULL,NULL, INTERNET_SERVICE_HTTP, INTERNET_FLAG_SECURE, 1);
        if (hConnect != NULL) 
        {
            wstring request = _page + 
                    (_params.empty() ? L"" : (L"?" + _params));

            // open request
            HINTERNET hRequest = ::HttpOpenRequest(hConnect, L"GET", (LPCWSTR)request.c_str() ,NULL, NULL, 0, INTERNET_FLAG_KEEP_CONNECTION, 1);
            if (hRequest != NULL) 
            {   
                // send request
                BOOL isSend = ::HttpSendRequest(hRequest, NULL, 0, NULL, 0);

                if (isSend)
                {
                    for(;;)
                    {
                        // reading data
                        DWORD dwByteRead;
                        BOOL isRead = ::InternetReadFile(hRequest, szData, sizeof(szData) - 1, &dwByteRead);

                        // break cycle if error or end
                        if (isRead == FALSE || dwByteRead == 0)
                            break;

                        // saving result
                        szData[dwByteRead] = 0;
                    }
                }

                // close request
                ::InternetCloseHandle(hRequest);
            }
            // close session
            ::InternetCloseHandle(hConnect);
        }
        // close WinInet
       ::InternetCloseHandle(hInternet);
    }

    wstring answer = CharPToWstring(szData);

    return answer;
}


int _tmain(int argc, _TCHAR* argv[])
{
    wstring answer = SendHTTPSRequest_GET(L"www.site.com", L"page.php", L"param1=value1&param2=value2&param3=value3&param4=value4");

    return 0;
}

そして、私の関数は答えを返しました:

<html>

<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>

<body bgcolor="white">

<center><h1>400 Bad Request</h1></center>

<center>The plain HTTP request was sent to HTTPS port</center>

<hr><center>nginx/1.0.10</center>

</body>

</html>

私は何を間違っていますか?

4

1 に答える 1

14

INTERNET_FLAG_SECUREHttpOpenRequestではなく、 のフラグで使用する必要がありInternetConnectます。

これは、WinINet API フラグの MSDN ドキュメントで説明されています。

INTERNET_FLAG_SECURE

0x00800000

安全なトランザクション セマンティクスを使用します。これは、Secure Sockets Layer/Private Communications Technology (SSL/PCT) の使用に変換され、HTTP 要求でのみ意味があります。このフラグはHttpOpenRequestInternetOpenUrlhttps://で使用されますが、URL に表示される場合は冗長です。InternetConnect関数は、HTTP 接続にこのフラグを使用します。この接続で作成されたすべてのリクエスト ハンドルは、このフラグを継承します。

于 2013-09-20T10:00:57.097 に答える