简体   繁体   中英

HTTP Client library for C++

I'm trying to write milt-threaded HTTP proxy for learning C++/socket/HTTP

I'm looking for a HTTP client library like HttpURLConnection available in Java.

I looked at some libraries eg, libcurl for C/C++. These libraries can make http request but they will return with the full content. I need a library that can read content partially in a buffer so that I'm able to ship it immediately to requesting client, without storing the entire content in memory.

Any links/suggestions is highly appreciated :)

thank you!

libcurl docs have an example page on how to get incremental download callbacks (into a memory buffer) as data streams in from a request:

http://curl.haxx.se/libcurl/c/getinmemory.html

In your case, you would just forward the data buffer on to the client that originally made the request.

Beast is an open source C++ library which supports the functionality you desire. It has a "Writer" concept which supports suspending and resuming, incremental rendering of the body, and coroutines: http://vinniefalco.github.io/beast/beast/types/Writer.html

The library is here: http://vinniefalco.github.io/

Here's a complete example program:

#include <beast/http.hpp>
#include <boost/asio.hpp>
#include <iostream>
#include <string>

int main()
{
    // Normal boost::asio setup
    std::string const host = "boost.org";
    boost::asio::io_service ios;
    boost::asio::ip::tcp::resolver r(ios);
    boost::asio::ip::tcp::socket sock(ios);
    boost::asio::connect(sock,
        r.resolve(boost::asio::ip::tcp::resolver::query{host, "http"}));

    // Send HTTP request using beast
    beast::http::request_v1<beast::http::empty_body> req;
    req.method = "GET";
    req.url = "/";
    req.version = 11;
    req.headers.replace("Host", host + ":" + std::to_string(sock.remote_endpoint().port()));
    req.headers.replace("User-Agent", "Beast");
    beast::http::prepare(req);
    beast::http::write(sock, req);

    // Receive and print HTTP response using beast
    beast::streambuf sb;
    beast::http::response_v1<beast::http::streambuf_body> resp;
    beast::http::read(sock, sb, resp);
    std::cout << resp;
}

你可以试试cpp-netlib

Microsoft released "cpprestsdk" a modern, cross-platform, asynchronous rest client / server with json serialization / deserialization support. https://github.com/microsoft/cpprestsdk

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM