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. UVA12433 【Rent a Car】

    这题应该算是比较难的一道网络流的题,(但却在我校OJ考试上出现了),但是大家只要能理解此图的建边方式就行. 假设有5天的租车需求,虚拟出2*n+2 即 12个节点,0为源点,12为汇点. 1,源点到1 ...

  2. [py2neo]Ubuntu14 安装py2neo失败问题解决

    环境 1.操作系统Ubuntu14 2.py2neo版本4.1 3.python版本python3.4 问题 pip install py2neo==4.1  安装失败,提示: Cannot unin ...

  3. 让NOI Linux变得可用

    开始用NOI Linux-- 上古加阉割,还是32位,完全不可用的亚子-- 怎么办,我真的好想念16.04 于是就走上魔改之旅-- 一些神奇的操作 git 听说直接装的话会是上古版本 sudo add ...

  4. Function:凸包,单调栈,题意转化,单峰函数三分,离线处理

    很难啊啊啊!!! bzoj5380原题,应该可以粘题面. 问题转换: 有一个n列1e9行的矩阵,每一列上都写着相同的数字Ai. 你从位置(x,y)出发每一步可以向左上方或左方走一步,最后走到第一行. ...

  5. 小白学 Python(18):基础文件操作

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  6. NOIP模(ka)拟(chang)测试30 考试报告

    应得分:300 实得分:210 毒瘤卡常出题人,卡掉90分! T1 Return 开个副本数组sort一下,unique去重就可以啦.时间复杂度$ O(nlog2(n)) $ T2 One 其实就是约 ...

  7. 2684亿!阿里CTO张建锋:不是任何一朵云都撑得住双11

    2019天猫双11 成交额2684亿! "不是任何一朵云都能撑住这个流量.中国有两朵云,一朵是阿里云,一朵叫其他云."11月11日晚,阿里巴巴集团CTO张建锋表示,"阿里 ...

  8. NOIp2017 列队(线段树)

    嘛..两年前的题目了,想起第一次参加提高组还骗了一个省二回来呢...跟同学吹了好久的... 离退役又近了一骗博客啊.. 闲聊结束. 照常化简:给定一个1-n*m编号的矩阵,每次删除一个位置,然后左边向 ...

  9. python模块——socket

    实例一. server: #socket套接字(IP + 端口号)(qq,wechat 发送接收消息依靠socket模块),cs架构import socketserver = socket.socke ...

  10. c#属性(Property)

    属性(Property)是类(class).结构(structure)和接口(interface)的命名(named)成员.类或结构中的成员变量或方法称为 域(Field).属性(Property)是 ...