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

711 阅读2分钟

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

图片

动机

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

一:cpp-httplib简介

一个header-only且跨平台的C++ HTTP/HTTPS库

只需将httplib.h包含到你的工程中即可完成配置(header-only)

注意:此库在多线程下会阻塞运行,暂不支持非阻塞运行

跨平台!!!这个很重要,我经常在Windows和Linux来回换着编程

此库既支持用C++编写客户端访问HTTP服务器, 也支持用于编写C++服务端。由于本人实际工作用很少用C++编写服务端,所以就不在这里介(误)绍(导)了。

二:主要用法

  1. 工程引用

     //只需包含头文件即可
     #include "path/to/httplib.h"
    
  2. 发送POST请求

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

       //无参调用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);  
      
    2. 调用格式

       #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();
              ...
          }
       }
       
      
    3. 上面给出了带参数访问Post接口的示例,读者可根据自己需求改动~

  3. 发送Get请求

    1. 几个重要的构造函数

       //无参调用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;
        });
      
    2. 调用格式参考Post

  4. 其他的HTTP方法

     //PUT
     res = cli.Put("/resource/foo""text""text/plain");
     
     //DELETE
     res = cli.Delete("/resource/foo");
    

三:注意事项

  1. 此库支持g++4.8及下不受支持

  2. 在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>
    

欢迎大家点赞评论加转发! 各位同学的点赞评论加转发是我持续写作输出的动力!,不知之处也欢迎大家批评指正!