首页 > Windows开发 > 详细

使用Windows API发送HTTP(S)请求

时间:2019-02-19 15:27:30      阅读:259      评论:0      收藏:0      [点我收藏+]

先看一个简单的GET示例

#include <Windows.h>
#include <winhttp.h>
#include <stdio.h>
int main()
{
    HINTERNET sessionHandle = WinHttpOpen(L"WinHttp Example", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
    if (sessionHandle)
    {
        HINTERNET connectionHandle = WinHttpConnect(sessionHandle, L"example.com", INTERNET_DEFAULT_HTTP_PORT, 0);
        if (connectionHandle)
        {
            HINTERNET requestHandle = WinHttpOpenRequest(connectionHandle, L"GET", L"", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
            if (requestHandle)
            {
                BOOL success = WinHttpSendRequest(requestHandle, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
                if (success)
                {
                    success = WinHttpReceiveResponse(requestHandle, NULL);
                    if (success)
                    {
                        DWORD dwSize;
                        do
                        {
                            dwSize = 0;
                            LPSTR pszOutBuffer;
                            DWORD dwDownloaded = 0;
                            if (!WinHttpQueryDataAvailable(requestHandle, &dwSize))
                            {
                                printf("Error %u in WinHttpQueryDataAvailable.\n", GetLastError());
                                break;
                            }
                            // No more available data.
                            if (!dwSize)
                                break;
                            // Allocate space for the buffer.
                            pszOutBuffer = new char[dwSize + 1];
                            if (!pszOutBuffer)
                            {
                                printf("Out of memory\n");
                                break;
                            }
                            // Read the Data.
                            ZeroMemory(pszOutBuffer, dwSize + 1);
                            if (!WinHttpReadData(requestHandle, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded))
                            {
                                printf("Error %u in WinHttpReadData.\n", GetLastError());
                            }
                            else
                            {
                                printf("%s", pszOutBuffer);
                            }
                            // Free the memory allocated to the buffer.
                            delete[] pszOutBuffer;
                            // This condition should never be reached since WinHttpQueryDataAvailable
                            // reported that there are bits to read.
                            if (!dwDownloaded)
                                break;
                        } while (dwSize > 0);
                    }
                    else
                    {
                        // Report any errors.
                        printf("Error %d has occurred.\n", GetLastError());
                    }
                }
                else
                {
                    printf("Request failed\n");
                }
                WinHttpCloseHandle(requestHandle);
            }
            else
            {
                printf("Invalid request handle\n");
            }
            WinHttpCloseHandle(connectionHandle);
        }
        else
        {
            printf("Invalid connection handle\n");
        }
        WinHttpCloseHandle(sessionHandle);
    }
    else
    {
        printf("Invalid WinHTTP-session handle\n");
    }
    system("pause");
    return 0;
}

有没有一种要崩溃的节奏技术分享图片仅从example.com获取网页代码,就要写约90行的代码

更麻烦的不是代码量的问题,而是这些API暴露了太多的细节(当然,暴露细节的好处是不限制开发员的思想,根据需求灵活编码)。很多时候,我们并不需要考虑那么多的细节

试着封装成C++类的形式,然而我放弃了,真的太麻烦了技术分享图片还是用libcurl或cpr之类的库吧

参考链接:WinHttpReadData function | Microsoft Docs

使用Windows API发送HTTP(S)请求

原文:https://www.cnblogs.com/buyishi/p/10400311.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!