入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

libcurl进行HTTP GET获取解析JSON数据

创建时间:2017-03-30 投稿人: 浏览次数:3177
  • 功能
    在Mac下,利用libcurl库进行HTTP GET操作,循环获取json数据并解析。

  • 依赖库

boost
libcurl
  • 代码
#include <curl/curl.h>
#include <curl/easy.h>
#include <curl/curlbuild.h>
#include <sstream>
#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/foreach.hpp>
#include <string>
#include <ctime>

#ifdef _WINDOWS
#include <windows.h>
#else
#include <unistd.h>
#define Sleep(x) usleep((x)*1000)
#endif

using namespace std;
using namespace boost::property_tree;


size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) {
    string data((const char*) ptr, (size_t) size * nmemb);
    *((stringstream*) stream) << data << endl;
    return size * nmemb;
}

int main(int argc, char *argv[])
{
    while(true)
    {
        // 基于当前系统的当前日期/时间
        time_t now = time(0);
        char* dt = ctime(&now);
        cout << dt << "-------------------------------------" << endl;

        /*HTTP GET json data*/
        std::stringstream out;
        void* curl = curl_easy_init();
        // 设置URL
        curl_easy_setopt(curl, CURLOPT_URL, "http://172.21.1.121:4000/api/officeZone1/tempHum/allDevices/last");
        // 设置接收数据的处理函数和存放变量
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &out);

        // 执行HTTP GET操作
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform() failed: %s
", curl_easy_strerror(res));
        }

        // 接受数据存放在out中,输出之
        //cout << out.str() << endl;
        string str_json = out.str();
        curl_easy_cleanup(curl);


        /*Parse json data*/
        ptree pt;                       //define property_tree object
        std::stringstream ss(str_json);
        try {
            read_json(ss, pt);          //parse json
        } catch (ptree_error & e) {
            return 1;
        }

        ptree errortype = pt.get_child("");

        for (boost::property_tree::ptree::iterator it = errortype.begin(); it != errortype.end(); ++it) {
            std::cout << it->first;
            std::cout << it->second.get<std::string>("id") << " "
                      << it->second.get<std::string>("temperature") << " "
                      << it->second.get<std::string>("humidity") << " "
                      << std::endl;
        }
        Sleep(1000);
    }
    return 0;
}
  • json数据格式
[{"id":115,"chipid":2956442,"date":"2017-03-30 14:06:44","timestamp":1490854004,"temperature":25,"humidity":40.9},
{"id":113,"chipid":2928629,"date":"2017-03-30 14:06:38","timestamp":1490853998,"temperature":24.5,"humidity":58.2},
{"id":112,"chipid":2943477,"date":"2017-03-30 14:07:02","timestamp":1490854022,"temperature":25,"humidity":42.6},
{"id":111,"chipid":2974582,"date":"2017-03-30 14:06:40","timestamp":1490854000,"temperature":24.2,"humidity":33.6},
……
]
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像