Avatar ·

Как сделать HTTP запрос в C++?

Всем привет! Подскажите, пожалуйста, как правильно сделать HTTP-запрос (GET/POST) на чистом C++ без использования сторонних библиотек вроде Boost.Beast или cURL? Пишу небольшой консольный клиент для работы с REST API, но не могу найти встроенных средств для работы с HTTP.

Пробовал использовать winsock2 на Windows и sys/socket.h на Linux, но столкнулся с проблемами: во-первых, при отправке GET-запроса сервер возвращает ошибку 400 Bad Request, во-вторых, не получается корректно обработать chunked transfer encoding в ответе. Вот пример моего кода:

#ifdef _WIN32
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#endif

#include <iostream>
#include <string>

int main() {
    // ... создание сокета и подключение к example.com:80 ...
    std::string request = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n";
    send(sock, request.c_str(), request.size(), 0);
    // ... чтение ответа ...
}

Ожидаю, что получу HTML-код страницы example.com, но вместо этого приходит либо пустой ответ, либо ошибка. Может быть, я неправильно формирую HTTP-заголовки? Или нужно использовать специальные флаги при создании сокета?

Буду благодарен за пример рабочего кода с пояснениями. Также интересует, как обрабатывать HTTPS (SSL/TLS) запросы без внешних библиотек — возможно ли это вообще стандартными средствами C++17/20?