当前位置:   article > 正文

推荐一个比较好用的c++版本http协议库-cpp-httplib_#include

#include

码云地址:https://gitee.com/fensnote/cpp-httplib

如果是使用32位编译器,可能会报错,修改一下地方即可正常编译:

修改内容

cpp-httplib

(https://ci.appveyor.com/project/yhirose/cpp-httplib)

A C++11 header-only HTTP library.

It’s extremely easy to setup. Just include httplib.h file in your code!

Inspired by Sinatra and express.

Server Example

#include <httplib.h>

int main(void)
{
    using namespace httplib;

    Server svr;

    svr.Get("/hi", [](const Request& req, Response& res) {
        res.set_content("Hello World!", "text/plain");
    });

    svr.Get(R"(/numbers/(\d+))", [&](const Request& req, Response& res) {
        auto numbers = req.matches[1];
        res.set_content(numbers, "text/plain");
    });

    svr.listen("localhost", 1234);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Post, Put, Delete and Options methods are also supported.

Bind a socket to multiple interfaces and any available port

int port = svr.bind_to_any_port("0.0.0.0");
svr.listen_after_bind();
  • 1
  • 2

Method Chain

svr.Get("/get", [](const auto& req, auto& res) {
        res.set_content("get", "text/plain");
    })
    .Post("/post", [](const auto& req, auto& res) {
        res.set_content(req.body(), "text/plain");
    })
    .listen("localhost", 1234);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Static File Server

svr.set_base_dir("./www");
  • 1

Logging

svr.set_logger([](const auto& req, const auto& res) {
    your_logger(req, res);
});
  • 1
  • 2
  • 3

Error Handler

svr.set_error_handler([](const auto& req, auto& res) {
    const char* fmt = "<p>Error Status: <span style='color:red;'>%d</span></p>";
    char buf[BUFSIZ];
    snprintf(buf, sizeof(buf), fmt, res.status);
    res.set_content(buf, "text/html");
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

‘multipart/form-data’ POST data

svr.Post("/multipart", [&](const auto& req, auto& res) {
    auto size = req.files.size();
    auto ret = req.has_file("name1"));
    const auto& file = req.get_file_value("name1");
    // file.filename;
    // file.content_type;
    auto body = req.body.substr(file.offset, file.length));
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Client Example

GET

#include <httplib.h>
#include <iostream>

int main(void)
{
    httplib::Client cli("localhost", 1234);

    auto res = cli.Get("/hi");
    if (res && res->status == 200) {
        std::cout << res->body << std::endl;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

POST

res = cli.Post("/post", "text", "text/plain");
res = cli.Post("/person", "name=john1&note=coder", "application/x-www-form-urlencoded");
  • 1
  • 2

POST with parameters

httplib::Params params;
params.emplace("name", "john");
params.emplace("note", "coder");

auto res = cli.Post("/post", params);
  • 1
  • 2
  • 3
  • 4
  • 5

or

httplib::Params params{
  { "name", "john" },
  { "note", "coder" }
};

auto res = cli.Post("/post", params);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

PUT

res = cli.Put("/resource/foo", "text", "text/plain");
  • 1

DELETE

res = cli.Delete("/resource/foo");
  • 1

OPTIONS

res = cli.Options("*");
res = cli.Options("/resource/foo");
  • 1
  • 2

Connection Timeout

httplib::Client cli("localhost", 8080, 5); // timeouts in 5 seconds
  • 1

With Progress Callback

httplib::Client client(url, port);

// prints: 0 / 000 bytes => 50% complete
std::shared_ptr<httplib::Response> res =
    cli.Get("/", [](uint64_t len, uint64_t total) {
        printf("%lld / %lld bytes => %d%% complete\n",
            len, total,
            (int)((len/total)*100));
        return true; // return 'false' if you want to cancel the request.
    }
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

progress

This feature was contributed by underscorediscovery.

Range

httplib::Client cli("httpbin.org", 80);

// 'Range: bytes=1-10'
httplib::Headers headers = { httplib::make_range_header(1, 10) };

auto res = cli.Get("/range/32", headers);
// res->status should be 206.
// res->body should be "bcdefghijk".
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

OpenSSL Support

SSL support is available with CPPHTTPLIB_OPENSSL_SUPPORT. libssl and libcrypto should be linked.

#define CPPHTTPLIB_OPENSSL_SUPPORT

SSLServer svr("./cert.pem", "./key.pem");

SSLClient cli("localhost", 8080);
  • 1
  • 2
  • 3
  • 4
  • 5

Zlib Support

‘gzip’ compression is available with CPPHTTPLIB_ZLIB_SUPPORT.

The server applies gzip compression to the following MIME type contents:

  • all text types
  • image/svg+xml
  • application/javascript
  • application/json
  • application/xml
  • application/xhtml+xml

NOTE

g++ 4.8 cannot build this library since <regex> in g++4.8 is broken.

License

MIT license (© 2019 Yuji Hirose)

推荐好用的c++工具,欢迎关注微信公众号:fensnote
嵌入式笔记

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/194869
推荐阅读
相关标签
  

闽ICP备14008679号