Program Tip

Boost.ASIO 기반 HTTP 클라이언트 라이브러리 (예 : libcurl)

programtip 2020. 12. 5. 10:30
반응형

Boost.ASIO 기반 HTTP 클라이언트 라이브러리 (예 : libcurl)


libcurl의 단점은 C ++ 래퍼로 해결하기 어렵 기 때문에 최신 C ++ HTTP 라이브러리를 찾고 있습니다. 사실상 C ++ TCP 라이브러리가 된 Boost.ASIO 기반 솔루션이 선호됩니다.


다른 날 누군가가 다른 스레드에서 이것을 추천했습니다 .

http://cpp-netlib.github.com/

나는 이것이 당신이 찾을 수있는 것처럼 높은 수준이라고 생각하지만 아직 충분히 성숙했는지는 확실하지 않습니다 (Boost 포함을 위해 제안했기 때문일 것입니다).


결코 늦지 않는 것이 좋습니다. 여기에 오래된 질문에 대한 새로운 답변이 있습니다. Boost.Asio를 사용하여 HTTP 및 WebSocket 기능을 모두 제공하는 Boost.Beast라는 새로운 오픈 소스 라이브러리가 있습니다. 익숙한 Asio 인터페이스를 최대한 가깝게 에뮬레이트하고 많은 문서를 얻었습니다. bjam 또는 CMake를 사용하여 clang, gcc 및 Visual Studio에서 빌드됩니다. 나는 또한 도서관의 저자이기도합니다.

https://github.com/boostorg/beast/

다음은 웹 페이지를 검색하는 완전한 예제 프로그램입니다.

#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/version.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <cstdlib>
#include <iostream>
#include <string>

using tcp = boost::asio::ip::tcp;       // from <boost/asio/ip/tcp.hpp>
namespace http = boost::beast::http;    // from <boost/beast/http.hpp>

// Performs an HTTP GET and prints the response
int main(int argc, char** argv)
{
    try
    {
        // Check command line arguments.
        if(argc != 4 && argc != 5)
        {
            std::cerr <<
                "Usage: http-client-sync <host> <port> <target> [<HTTP version: 1.0 or 1.1(default)>]\n" <<
                "Example:\n" <<
                "    http-client-sync www.example.com 80 /\n" <<
                "    http-client-sync www.example.com 80 / 1.0\n";
            return EXIT_FAILURE;
        }
        auto const host = argv[1];
        auto const port = argv[2];
        auto const target = argv[3];
        int version = argc == 5 && !std::strcmp("1.0", argv[4]) ? 10 : 11;

        // The io_context is required for all I/O
        boost::asio::io_context ioc;

        // These objects perform our I/O
        tcp::resolver resolver{ioc};
        tcp::socket socket{ioc};

        // Look up the domain name
        auto const results = resolver.resolve(host, port);

        // Make the connection on the IP address we get from a lookup
        boost::asio::connect(socket, results.begin(), results.end());

        // Set up an HTTP GET request message
        http::request<http::string_body> req{http::verb::get, target, version};
        req.set(http::field::host, host);
        req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);

        // Send the HTTP request to the remote host
        http::write(socket, req);

        // This buffer is used for reading and must be persisted
        boost::beast::flat_buffer buffer;

        // Declare a container to hold the response
        http::response<http::dynamic_body> res;

        // Receive the HTTP response
        http::read(socket, buffer, res);

        // Write the message to standard out
        std::cout << res << std::endl;

        // Gracefully close the socket
        boost::system::error_code ec;
        socket.shutdown(tcp::socket::shutdown_both, ec);

        // not_connected happens sometimes
        // so don't bother reporting it.
        //
        if(ec && ec != boost::system::errc::not_connected)
            throw boost::system::system_error{ec};

        // If we get here then the connection is closed gracefully
    }
    catch(std::exception const& e)
    {
        std::cerr << "Error: " << e.what() << std::endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

asio 작성자는 다음을 구현합니다.


Pion 네트워크 라이브러리도 확인해야합니다.

http://pion.org/projects/pion-network-library


Boost.Http - a new player here: https://github.com/BoostGSoC14/boost.http, docs - http://boostgsoc14.github.io/boost.http/


There's this project trying to "Boostify" libcurl: https://github.com/breese/trial.url

I'll use this as a reference to design Boost.Http client API. However, I plan to focus on high-level abstractions and try to collaborate as much as possible with Beast.HTTP author.

참고URL : https://stackoverflow.com/questions/2251361/boost-asio-based-http-client-library-like-libcurl

반응형