使用Boost Asio和OpenSSL创建HTTPS请求

Dev*_*Mac 5 c++ boost boost-asio

我创建了一个简单的HTTP请求,其中我向服务器发送GET,POST和PUT请求.接下来我想使用boost asio库切换到HTTPS连接,我该怎么办?

我有一个解析并连接到服务器的Executor类和一个创建请求的RequestCreator类.

seh*_*ehe 11

我碰巧在评论中发布了这样的东西(...):

你只需通过ssl连接.@Milind coliru.stacked-crooked.com/a/9546326fd1def416

所以也许对你有帮助.

Live On Coliru

#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
#include <iostream>

int main() {
    boost::system::error_code ec;
    using namespace boost::asio;

    // what we need
    io_service svc;
    ssl::context ctx(svc, ssl::context::method::sslv23_client);
    ssl::stream<ip::tcp::socket> ssock(svc, ctx);
    ssock.lowest_layer().connect({ {}, 8087 }); // http://localhost:8087 for test
    ssock.handshake(ssl::stream_base::handshake_type::client);

    // send request
    std::string request("GET /newGame?name=david HTTP/1.1\r\n\r\n");
    boost::asio::write(ssock, buffer(request));

    // read response
    std::string response;

    do {
        char buf[1024];
        size_t bytes_transferred = ssock.read_some(buffer(buf), ec);
        if (!ec) response.append(buf, buf + bytes_transferred);
    } while (!ec);

    // print and exit
    std::cout << "Response received: '" << response << "'\n";
}
Run Code Online (Sandbox Code Playgroud)

为了模拟服务器以进行演示,我一直在使用Asio示例中的证书和参数(/sf/answers/2184133521/).

更新这是一个使用解析器来解析端点的版本(Coliru不允许我们这样做,但它可以在非限制机器上工作).

Live On Coliru

ip::tcp::resolver resolver(svc);
auto it = resolver.resolve({"localhost", "8087"}); // http://localhost:8087 for test
boost::asio::connect(ssock.lowest_layer(), it);

// and the rest unaltered
ssock.handshake(ssl::stream_base::handshake_type::client);
Run Code Online (Sandbox Code Playgroud)

  • `auto`不依赖于编译器.它的标准版本依赖于c ++ 11引入它的意义.所有编译器都支持c ++ 11模式.优雅的关闭是什么意思?也许现在是时候搜索不同问题的现有答案了.如果一切都失败了,你可以问一个新问题 (2认同)