使用libcurl库,发送http接口定时向第三方服务器,获取部分json,数据用于解析,并且得到需要的信息,传给我们的子系统
通过打日志的方法,记录libcurl接收到的数据保持到本地磁盘,进行分析;
编写测试程序,验证每个文件能否被解析;如果可以解析,就把该文件删掉,否则留着;
string src_path; //= string(argv[1]);
string dst_path; //= string(argv[2]);
string time; //= string(argv[3]);
vector<string> m_vecFiles;
src_path = "D:\\rsp2";
if (FindFilesInFolder(src_path, m_vecFiles) == true) {
for (auto& it : m_vecFiles) {
string rspfilename = src_path+"\\" + it;
ifstream MyFile1(rspfilename, std::fstream::in);
bool bl = MyFile1.is_open();
bool bDelete = false;
string str;
while (std::getline(MyFile1, str)) {//和上面的读取方式写法类似,只是每次是读取一整行
if (str == "start") {
continue;
}
if (str == "end") {
continue;
}
Json::Value root;
Json::Reader reader;
if (!reader.parse(str.c_str(), root))
{
cout << "解析错误" << rspfilename<< endl;
continue;
}
/*
注意:json库使用,parse之后,root的类型有可能是json::intvalue
*/
if (root.type() != Json::objectValue)
{
//非json对象
bDelete = true;
cout << "非json对象" << rspfilename << endl;
continue;
}
//不关心Issuccess 和result
if (root["Data"].isNull()) {
//为空,则不处理
//cout << "Data is NUll" << str << endl;
bDelete = true;
continue;
}
if (!root["Data"].isArray())
{
cout << "Data is not Array" << str << endl;
continue;
}
//转换为数组
Json::Value& data = root["Data"];
//如果是Null,则全删除
if (data.size() == 0)
{
cout << "Data is null" << str << endl;
continue;
}
//如果有数据,则要和本地数据比较
//如果多了,则新增,如果一样,则保持,如果少了,则删除
map<std::string, std::string> newAlarm;
for (size_t i = 0; i < data.size(); i++) {
if ((data[i]["DevNum"].isNull()) || (data[i]["CallTime"].isNull()) || (data[i]["CallInfo"].isNull())
|| (!data[i]["DevNum"].isString()) || (!data[i]["CallTime"].isString()) || (!data[i]["CallInfo"].isString()))
{
//不满足解析要求,
cout << "Data is error" << str << endl;
continue;
}
else {
cout << "Data is OK" << str << endl;
bDelete = true;
}
}
}
MyFile1.close();
if (bDelete) {
::DeleteFile(rspfilename.c_str());
}
}
- 修改Libcurl接收代码,libcurl的接收函数回调函数,是有可能多次调用的;
- 针对文本数据,除了判断能否解析之外,还需要判断是否是Json::objectValue;
最后,记录此bug, 希望对大家开发相关程序有所帮助
。