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. Redis开发与运维:SDS

    STRING 我们会经常打交道的string类型,在redis中拥有广泛的使用.也是开启redis数据类型的基础. 在我最最开始接触的redis的时候,总是以为字符串类型就是值的类型是字符串. 比如: ...

  2. 安装requests遇到的坑

    通过pip install requests命令安装,报错,提示“SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed”.百思不得其解,后 ...

  3. [考试反思]0727NOIP模拟测试9

    啊哈?水到一个rk1? 谢谢诸位大佬放水让我这种人体验到了rk1的滋味. 怪怪的滋味.不太像我的水平. 其实这次考试心态已经佛了,刚意识到前6次考试累计的挺高的分数被清空了,7,8两场又爆炸了... ...

  4. T3hack大部分随机化数据

    1000 2000 1 2 1269 1 3 7707 1 4 3329 4 5 6789 1 6 6691 3 7 -1 1 8 2037 6 9 5427 6 10 5690 4 11 4847 ...

  5. git上传项目到github远程库

    最近在学习使用 git 上传管理项目,依照教程,建好了一个远程库,也实现了本地库与远程库的项目同步上传,但是在试着将本地库里的项目上传到另一个新建远程库时遇到了问题,一直上传不成功,经过一番查找摸索终 ...

  6. html5自动弹出软键盘的方法

    html5自动弹出软键盘的方法<pre> <textarea placeholder="说点什么......" autofocus="autofocus ...

  7. .NET Core 对龙芯的支持情况和对 .NET Core 开发嵌入式的思考

    目录 .NET Core 对龙芯的支持情况和对 .NET Core 开发嵌入式的思考 一,遗憾的尝试 二,.NET Core在嵌入式下的几点不足 三,.NET Core 龙芯移植的进展和资料 .NET ...

  8. 数据分析之路 第一篇 numpy

    第一篇 numpy 1.N维数组对象 :ndarray在Python中既然有了列表类型,为啥还要整个数组对象(类型)?那是因为:1.数组对象可以除去元素间运算所需要的循环,使得一维向量更像单个数据2. ...

  9. 领扣(LeetCode)七进制数 个人题解

    给定一个整数,将其转化为7进制,并以字符串形式输出. 示例 1: 输入: 100 输出: "202" 示例 2: 输入: -7 输出: "-10" 注意: 输入 ...

  10. linux启动与登录

    1.............rescue..............进入维护模式 (grub选项吧这是) 2.linux启动的幕后过程: 1 加电 (再一次联想服务器升级内存时,加电后有个黄色报警,过 ...