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. java的静态代理、jdk动态代理和cglib动态代理

    Java的代理就是客户端不再直接和委托类打交道,而是通过一个中间层来访问,这个中间层就是代理.使用代理有两个好处,一是可以隐藏委托类的实现:二是可以实现客户与委托类之间的解耦,在不修改委托类代码的情况 ...

  2. 洛谷P2107 【小Z的AK计划】

    #include<iostream> #include<queue> #include<algorithm> using namespace std; struct ...

  3. 九大Java性能调试工具,必备至少一款

    九款Java性能调试工具,有什么更好.更多的工具,欢迎补充. NetBeans Profiler NetBeans中可以找到NetBeans Profiler. NetBeans分析器是NetBean ...

  4. KETTLE常见问题和优化

    1.创建MySQL空资源库报错问题:因为boolean类型的问题,Mysql中的boolean类型实际上保存为TINYINT,需要手动的修改生成资源库的sql脚本,将其中的插入用户ENABLED的值由 ...

  5. go语言版本测试, 一段错误代码引发的血案

    起因: 最近在学习手写docker,看到了一段会编译错误的代码. 过程: 最近在学习docker,看到一段示例代码,每次编译时会报错. 因此, 无法继续下去, 只好在网上搜索解决方案, 用了很多时间, ...

  6. 【实用工具】这些你不得不知道的chrome插件,让你事半功倍

    平时chrome插件用多了,发现在工作中有很多插件特别好用,让你事半功倍.于是我抽时间整理了一些非常好用的chrome插件分享给大家,其中有些插件是我已经离不开,每天都在用的.希望这篇文章能帮助你找到 ...

  7. T7

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> us ...

  8. Docker 开篇 1 | 树莓派中搭建Docker

    官网三种安装方式,故不再赘述 大部分内容可参考官网链接:https://docs.docker.com/install/linux/docker-ce/debian/#install-docker-c ...

  9. nginx跨域解决方案

    nginx跨域解决方案Access to Font at 'http://47.104.86.187/yinjiatoupiao2/iconfont/iconfont.woff' from origi ...

  10. HttpClient 上传文件

    /// <summary> /// 发送post请求 /// </summary> /// <param name="filePath">文件路 ...