IE盒子

搜索
查看: 94|回复: 5

原来C++调用HTTP API接口也能这么优雅

[复制链接]

3

主题

9

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2022-12-28 12:02:37 | 显示全部楼层 |阅读模式
动机

在开发C++程序时,难免会遇到与其他语言/系统对接的情况。百度谷歌搜了一下,发现star最高的cpp-httplib。试了一下,真香!关键这个库还是header only 引用的,这个超级Nice!!从此以后再也不担心跨语言对接了(手动滑稽)。 本文仅作抛砖引玉~
一:cpp-httplib简介

一个header-only且跨平台的C++ HTTP/HTTPS库
只需将httplib.h包含到你的工程中即可完成配置(header-only)
注意:此库在多线程下会阻塞运行,暂不支持非阻塞运行
跨平台!!! 这个很重要,我经常在Windows和Linux来回换着编程
此库既支持用C++编写客户端访问HTTP服务器, 也支持用于编写C++服务端。由于本人实际工作用很少用C++编写服务端,所以就不在这里介(误)绍(导)了。
二:主要用法

  • 工程引用
//只需包含头文件即可
#include "path/to/httplib.h"

  • 发送POST请求

    • 先介绍几个重要的构造函数

//无参调用POST接口
httplib::Result Client::Post(const char *path);

//带参数调用POST接口, 参数一般是Json形式的
httplib::Result Client::Post(const char *path, const Params &params);       

//带Header、参数调用POST接口
httplib::Result Client::Post(const char *path, const Headers &headers,const Params &params);

//不带Header、表单参数调用POST接口
httplib::Result Client::Post(const char *path, const MultipartFormDataItems &items);

//带Header、表单参数调用Post参数
httplib::Result Client::Post(const char *path, const Headers &headers, const MultipartFormDataItems &items);  调用格式
#include <httplib.h>
#include <iostream>

int main(void)
{
    httplib::Client cli("localhost", 1234);
   
          httplib::Params params;
    params.emplace("name", "john");
    params.emplace("note", "coder");
   
    if (auto res = cli.Post("/post", params);)
    {
        if (res->status == 200)
        {
          std::cout << res->body << std::endl;
          //返回的结果可使用json对象建模,推荐看上一篇文章  
        
        }
    }
    else
    {
        auto err = res.error();
        ...
    }
}
    上面给出了带参数访问Post接口的示例,读者可根据自己需求改动~

  • 发送Get请求

    • 几个重要的构造函数

//无参调用Get接口
httplib::Result Client::Get(const char *path);

//带Header调用Get接口
httplib:: Result Client::Get(const char *path, const Headers &headers);

//使用ContentReceiver接受数据
std::string body;
auto res = cli.Get("/large-data",
  [&](const char *data, size_t data_length) {
    body.append(data, data_length);
    return true;
  });  调用格式参考Post

  • 其他的HTTP方法
//PUT
res = cli.Put("/resource/foo", "text", "text/plain");

//DELETE
res = cli.Delete("/resource/foo");三:注意事项

  • 此库支持g++4.8及下不受支持
  • 在Windows下,如果要包含windows.h, 则应httplib.h包含在Windows.h之前; 否则就要添加相关的宏定义
//注意:WIN8及更老的系统不支持。话说现在新开发的程序基本都在WIN10了吧。。。。。

#include <httplib.h>
#include <Windows.h>


//或者
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <httplib.h>欢迎大家点赞评论加转发, 各位同学的点赞评论加转发是我持续写作输出的动力,不知之处也欢迎大家批评指正~
感兴趣的小伙伴可以关注一下我个人的微信公众号 兰亭汇,这个公众号主要用于分享个人成长经历~~
回复

使用道具 举报

1

主题

5

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-12-28 12:03:01 | 显示全部楼层
他还有io功能?我只想解析和组织http,自己io,可用吗
回复

使用道具 举报

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-12-28 12:03:35 | 显示全部楼层
建议查看官方文档哈
回复

使用道具 举报

2

主题

10

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2022-12-28 12:03:52 | 显示全部楼层
你好,请教一下怎么用cpp-httplib和nlohmann/json 发送一个json数据到服务器?
回复

使用道具 举报

2

主题

5

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2022-12-28 12:04:09 | 显示全部楼层
http实现了类似key-value的形式 直接传就行了
回复

使用道具 举报

1

主题

5

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-12-28 12:05:04 | 显示全部楼层
怎么指定数据是UTF-8格式呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表