E.g and explaination:

  • Pre-condition: Server is running and can reciever CURL command with json format message, libcurl and jsoncpp lib installed and configured in makefile.
  • Curl command line. use POST command to request data
    •   curl -X POST http://xx.xx.xx.xx:port/rest/xxx -H 'Content-Type: application/json' -H 'fieldname: value' -d'{"yyy" :{"fieldname1" :{"Value" : "999"},"fieldname2" :{"Value" : "777"}}'

C++ code to send request to get access token:

int getData()
{
    CURLcode res;
    CURL * curl;
    JSONCPP_STRING errs;
    Json::Value root, res_output;
    Json::CharReaderBuilder reader_builder;
    bool json_res;
    char response_body[RESPONSE_BODY_SIZE] = {'\0'};
    memset(response_body, 0 , sizeof(response_body));
    struct curl_slist *headers=NULL;
    try
    {
       
        string auth_str =  "Authorization: Basic " + _auth_header;
        headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded");
        headers = curl_slist_append(headers, auth_str.c_str());
        string URL = "http://xxxx/...;
        
        curl = curl_easy_init();
        if(curl == NULL)
        {
            curl_slist_free_all(headers);
            return FAILURE;
        }
        if (//curl_easy_setopt(curl, CURLOPT_VERBOSE, 1) != CURLE_OK ||
            //curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug) != CURLE_OK ||
            curl_easy_setopt(curl, CURLOPT_URL, URL.c_str()) != CURLE_OK ||
            curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers) != CURLE_OK ||
            //curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0)!= CURLE_OK ||
            //curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0)!= CURLE_OK ||
            curl_easy_setopt(curl, CURLOPT_NOBODY, 1) != CURLE_OK ||
            curl_easy_setopt(curl, CURLOPT_POST, 1)  != CURLE_OK ||
            curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1)  != CURLE_OK ||
            curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 180000) != CURLE_OK ||
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData) != CURLE_OK ||
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, response_body) != CURLE_OK )
        {
            GFRLOG_ERROR("Couldn't set cURL options");
            if (curl)
                {
                    curl_slist_free_all(headers);
                    curl_easy_cleanup(curl);
                }
            return -1;   
        }
        else
        {
            GFRLOG_DEBUG("curl setopt done");
        }
       
        res = curl_easy_perform(curl);
        if (CURLE_OK == res)
        {
            /* response E.g:
       {
            "access_token": "3776be6d-1394-40a3-bbbb-6e54c1ba8594",
            "token_type": "bearer",
            "expires_in": 43199,
            "scope": "read write trust"
            }*/
            char *content_type;        
            res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &content_type);
            if((CURLE_OK == res) && content_type)
            {
                std::unique_ptr<Json::CharReader> const jsonReader(reader_builder.newCharReader());
                json_res = jsonReader->parse(response_body, response_body + strlen(response_body), &root, &errs);
               
                if (!json_res || !errs.empty()) {
                    GFRLOG_DEBUG("parse response Json err: " << errs);
                    if (curl)
                    {
                        curl_slist_free_all(headers);
                        curl_easy_cleanup(curl);
                    }
                    return FAILURE;
                }
                else
                { 
                    _access_token =  root["access_token"].asString();
                    _expires_in =  atoi(root["expires_in"].asString().c_str());
         }
            }
        }
        else{
            GFRLOG_ERROR("Failed to get response from " << URL << " error msg: "<< curl_easy_strerror(res)); 
            if (curl)
                {
                    curl_slist_free_all(headers);
                    curl_easy_cleanup(curl);
                } 
            return FAILURE;
        }
    }
    catch(const Json::LogicError &e)
    {
        GFRLOG_ERROR("Parse json string error!");
        if (curl)
            {
                curl_slist_free_all(headers);
                curl_easy_cleanup(curl);
            } 
        return FAILURE;
    }
    if (curl)
    {
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    } 
    return  SUCCESS;
}
 
static int OnDebug(CURL *, curl_infotype itype, char * pData, size_t size, void *) 
    if(itype == CURLINFO_TEXT)
    { 
        printf("[TEXT]%s\n", pData); 
    } 
    else if(itype == CURLINFO_HEADER_IN) 
    { 
        printf("[HEADER_IN]%s\n", pData); 
    } 
    else if(itype == CURLINFO_HEADER_OUT)
    { 
        printf("[HEADER_OUT]%s\n", pData); 
    } 
    else if(itype == CURLINFO_DATA_IN) 
    { 
        printf("[DATA_IN]%s\n", pData); 
    } 
    else if(itype == CURLINFO_DATA_OUT) 
    { 
        printf("[DATA_OUT]%s\n", pData); 
    } 
    return 0; 
}
 
static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid) 
{

 

char* response_body = (char*)lpVoid;

    uint32_t response_body_len = strlen(response_body);
    uint32_t len = size * nmemb;
    if (len > RESPONSE_BODY_SIZE - response_body_len - 1)
    {
        len = RESPONSE_BODY_SIZE - response_body_len - 1;
    }
    memcpy(response_body + response_body_len, buffer, len);
    return size*nmemb;
 
/* below functions should call at the beginnig or and in the end
Do not call it in each thread!*/
int curl_global_initiate()
{
    if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK )
    {
        GFRLOG_BYPASS("curl_global_init failed");
        return FAILURE;
    }
    else{
        GFRLOG_BYPASS("curl_global_init done");
        return SUCCESS;
    }
}
int curl_global_clean()
{
    GFRLOG_BYPASS("curl_global_cleanup done");
    curl_global_cleanup();
}

c++ use curllib send REST API request to Web server的更多相关文章

  1. <<网络是怎样连接的>>笔记第6章 request到达Web server, return response to browser

    短短漫长旅程迎来终点. 概览.整体结构. 服务器的协议栈如何接收数据. 服务器解释request message并respond browser 接收response message并显示内容. 6. ...

  2. Blocking Cross Origin API request for /api/contents Creating Notebook Failed An error occurred while creating a new notebook.

    anacoda安装的jupyter,使用nginx进行了转发,远程访问可以进去,但是创建文件和创建目录都会报错 浏览器页面报错: 第一次使用jupyter创建python时错误:Creating No ...

  3. ASP.NET Web API与Rest web api(一)

    HTTP is not just for serving up web pages. It is also a powerful platform for building APIs that exp ...

  4. ASP.NET Web API与Rest web api(一)

    本文档内容大部分来源于:http://www.cnblogs.com/madyina/p/3381256.html HTTP is not just for serving up web pages. ...

  5. Web API 2 入门——Web API 2(C#)入门(谷歌翻译)

    ASP.NET Web API 2(C#)入门 在这篇文章中 本教程中使用的软件版本 创建一个Web API项目 添加模型 添加控制器 使用Javascript和jQuery调用Web API 运行应 ...

  6. [Web API] 如何让 Web API 统一回传格式以及例外处理[转]

    [Web API] 如何让 Web API 统一回传格式以及例外处理 前言 当我们在开发 Web API 时,一般的情况下每个 API 回传的数据型态或格式都不尽相同,如果你的项目从头到尾都是由你一个 ...

  7. [Web API] 如何让 Web API 统一回传格式以及例外处理

    [Web API] 如何让 Web API 统一回传格式以及例外处理 前言 当我们在开发 Web API 时,一般的情况下每个 API 回传的数据型态或格式都不尽相同,如果你的项目从头到尾都是由你一个 ...

  8. jboss7 Java API for RESTful Web Services (JAX-RS) 官方文档

    原文:https://docs.jboss.org/author/display/AS7/Java+API+for+RESTful+Web+Services+(JAX-RS) Content Tuto ...

  9. 网站错误记录:A transport-level error has occurred when sending the request to the server.

    今天查看公司项目的日志文件,发现有这个错误:A transport-level error has occurred when sending the request to the server. 感 ...

随机推荐

  1. 面经-科大讯飞AI研究院

    面试时间:2019.06.27 电话面试 面试岗位:计算机视觉算法工程师/一面 面试时长:45分钟 面试内容: 自我介绍 简历中选择一个项目介绍-视频召回 问及项目中的语音.人脸.标题.模态缺失相关细 ...

  2. 三分钟学会Redis在.NET Core中做缓存中间件

    大家好,今天给大家说明如何在.NET Core中使用Redis,我们在想要辩论程序的好与坏,都想需要一个可视化工具,我经常使用的是一位国内大牛开发的免费工具,其Github地址为: https://g ...

  3. P2934 [USACO09JAN]安全出行

    图论瞎搞...... solution: 按例化简:给定一个无向图,保证单源最短路唯一,求每个点到1号点的最短路最后一条边被封锁的情况下的最短路 乍一看,应该是次短路,但是稍微用脚趾头想想都能发现不是 ...

  4. 震惊!我竟然发现了JDK源码的问题

    读源码时的思考 最近在看concurrent包下线程池的源码,当我看到ThreadPoolExecutor类的时候,发现了JDK源码的一个问题.以下是ThreadPoolExecutor类的addWo ...

  5. springcloud微服务基于redis集群的单点登录

    springcloud微服务基于redis集群的单点登录 yls 2019-9-23 简介 本文介绍微服务架构中如何实现单点登录功能 创建三个服务: 操作redis集群的服务,用于多个服务之间共享数据 ...

  6. OC语言自学基础知识总结

    一.成员变量的作用域 二.点语法 三.构造方法 四.分类 五.类的本质 六.自动生成getter和setter方法 七.description方法 八.id类型 九.SEL 一.成员变量的作用域 @p ...

  7. flink 流式处理中如何集成mybatis框架

    flink 中自身虽然实现了大量的connectors,如下图所示,也实现了jdbc的connector,可以通过jdbc 去操作数据库,但是flink-jdbc包中对数据库的操作是以ROW来操作并且 ...

  8. Geometry 判断几何是否被另一个几何/线段分割成多段

    如下图,如何判断几何多边形A被多边形B,切割为多段几何? 几何A被几何B切割 1. 获取几何A与几何B的交集C var intersectGeometry = new CombinedGeometry ...

  9. hdu 1166 敌兵布阵 (线段树、单点更新)

    敌兵布阵Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  10. C语言1博客作业01

    1 你对软件工程专业或者计算机科学与技术专业了解是怎样? 主修大数据技术导论.数据采集与处理实践(Python).Web前/后端开发.统计与数据分析.机器学习.高级数据库系统.数据可视化.云计算技术. ...