Tento příklad používá boost::beast pro HTTPS požadavek na ipify.org a parsuje odpověď pomocí boost::json.
boostbeast_https_json.cpp
#include <iostream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <boost/beast/core.hpp>
#include <boost/beast/ssl.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/version.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ssl.hpp>
#include <boost/json.hpp>
#include <openssl/ssl.h>
namespace beast = boost::beast;
namespace http = beast::http;
namespace net = boost::asio;
namespace ip = boost::asio::ip;
namespace ssl = boost::asio::ssl;
namespace json = boost::json;
using tcp = boost::asio::ip::tcp;
int main()
{
std::string host = "api64.ipify.org";
// Inicializovat IO kontext
net::io_context ioc;
ssl::context ctx(ssl::context::tlsv13_client);
ctx.set_default_verify_paths();
// Nastavit SSL kontext
beast::ssl_stream<beast::tcp_stream> stream(ioc, ctx);
stream.set_verify_mode(ssl::verify_none);
stream.set_verify_callback([](bool preverified, ssl::verify_context& ctx) {
return true; // Accept any certificate
});
// Povolit SNI
if(!SSL_set_tlsext_host_name(stream.native_handle(), host.c_str())) {
beast::error_code ec{static_cast<int>(::ERR_get_error()), net::error::get_ssl_category()};
throw beast::system_error{ec};
}
// Připojit se k HTTPS serveru
ip::tcp::resolver resolver(ioc);
get_lowest_layer(stream).connect(resolver.resolve({host, "https"}));
get_lowest_layer(stream).expires_after(std::chrono::seconds(30));
// Sestavit požadavek
http::request<http::empty_body> req{http::verb::get, "/?format=json" , 11};
req.set(http::field::host, host);
req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
// Odeslat požadavek
stream.handshake(ssl::stream_base::client);
http::write(stream, req);
// Přijmout odpověď
beast::flat_buffer buffer;
http::response<http::dynamic_body> res;
http::read(stream, buffer, res);
// Parsovat JSON odpověď
json::error_code err;
json::value j = json::parse(buffers_to_string(res.body().data()), err);
std::cout << "IP address: " << j.at("ip").as_string() << std::endl;
if (err) {
std::cerr << "Error parsing JSON: " << err.message() << std::endl;
}
// Úklid:
beast::error_code ec;
stream.shutdown(ec);
if (ec == net::error::eof) {
ec = {};
}
if (ec) {
throw beast::system_error{ec};
}
return 0;
}Kompilujte pomocí
build_http_example.sh
g++ -g -o http-example http-example.cpp -lcrypto -lssl -lboost_jsonPříklad výstupu:
example_output.txt
IP address: "2a01:c22:6f8c:ef00:f0bb:a8a8:9c00:ff49"Pokud vám tento článek pomohl, zvažte, zda mi nekoupíte kávu nebo nepřispějete přes PayPal na podporu výzkumu a publikování nových článků na TechOverflow