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. pymssql连接Azure SQL Database

    使用pymssql访问Azure SQL Database时遇到"DB-Lib error message 20002, severity 9:\nAdaptive Server conne ...

  2. 学习笔记32_EF查询优化

    *如果有 var temp = from m in dbContext.Model1 where m.属性1 == value select m; foreach(var m1 in temp)//这 ...

  3. JavaSE语法(中)

    6.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 是值传递.Java语言的方法调用支持参数的值传递.当一个对象实例作为一个 ...

  4. [考试反思]0918csp-s模拟测试46:残存

    我... 行吧大概说说. T1打的n2dp,什么随机化什么改变读入顺序都能AC. 没想优化.打了个链表优化dp.不知为何WA了. T2读错题,死了. T3的50分暴力没来得及优化感觉思路很神仙(然而并 ...

  5. CSPS模拟 42

    T3数位$dp$还没改完啊 哭了 T1 对$DAG$里所有点求他能到达的点的数量 考试时算了$bitset$内存扛不住,yy了个线段树合并上去 没有A不是因为被卡了,而是数组又开小了.. 我以为不能卡 ...

  6. Linux学习(推荐学习资源)——保持更新

    1. 介绍 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的Unix工具软件.应用程序和网络协议. ...

  7. Python 基础 内置函数 迭代器与生成器

    今天就来介绍一下内置函数和迭代器 .生成器相关的知识 一.内置函数:就是Python为我们提供的直接可以使用的函数. 简单介绍几个自己认为比较重要的 1.#1.eval函数:(可以把文件中每行中的数据 ...

  8. [综合] ISE的综合结果

    1.count2 == 7‘d12,会被综合成下面这个样子, 7‘d12就是左边下面这根绿线,等于符号在中间的圆圈里. 2.什么线都不点的时候,也就什么也没被选中, 而一旦我点击了某根线,却发现图里到 ...

  9. 第一个Hadoop程序-单词计数

    上一篇配置了Hadoop,本文将测试一个Hadoop的小案例 hadoop的Wordcount程序是hadoop自带的一个小的案例,是一个简单的单词统计程序,可以在hadoop的解压包里找到,如下: ...

  10. Python input函数使用

    本文链接:https://www.cnblogs.com/zyuanlbj/p/11905475.html 函数定义 def input(*args, **kwargs): # real signat ...