#include "stdafx.h" #include "CellHttpClient.h" #include "IvrFlow.h" #include "FlowDataProvider.h" #include "json.h" #include #include using namespace std; IMPLEMENT_CELL_AUTOCREATE(CCellHttpClient, CELL_NAME_HTTP) CCellHttpClient::CCellHttpClient() { cout << "CCellHttpClient::CCellHttpClient()" << endl; m_IsSaveRs = 0; m_SuccessPos = 0; m_FailPos = 0; m_Url = ""; } CCellHttpClient::CCellHttpClient(CCellHttpClient & CellHttpClient) : CCellBase(CellHttpClient) { cout << "CCellHttpClient::CCellHttpClient(CCellHttpClient & CellHttpClient)" << endl; m_IsSaveRs = CellHttpClient.m_IsSaveRs; m_SuccessPos = CellHttpClient.m_SuccessPos; m_FailPos = CellHttpClient.m_FailPos; m_Url = CellHttpClient.m_Url; //m_RespVar = CellHttpClient.m_RespVar; } CCellHttpClient::~CCellHttpClient() { cout << "CCellHttpClient::~CCellHttpClient()" << endl; } int CCellHttpClient::operate(void) { cout << "CCellHttpClient::operate(void)" << endl; if (m_pIvrFlow == NULL) return CELL_OP_ERROR; CString Info; _getCellInfo(Info); ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 开始执行[%s]"), Info); CString t_Url; // 替换url语句中的变量 if (!m_pIvrFlow->replaceVar(m_Url, t_Url)) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 替换URL语句中变量失败, URL = %s"), Info, t_Url); return m_FailPos; } DataSet & RS = m_pIvrFlow->recordSet(); RS.RemoveAll(); string t_resp; CURLcode curlStatus = CHttpUtil::GetInstance().curl_get_req(t_Url.GetBuffer(0), t_resp); if (CURLE_OK != curlStatus) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, Http访问失败, Curl Error = %d"), Info, curlStatus); return m_FailPos; } cout << t_Url << endl; cout << t_resp << endl; cout << "----------------------------------------------" << endl; // t_resp = "{\"item_key1\":\"item_value1\",\"item_key2\":\"item_value2\",\"item_key3\":\"item_value3\",\"item_key4\":132,\"item_key5\":999999999999999}"; //t_resp = "{ \"state\":\"success\",\"message\" : \"获取最近沟通的坐席\",\"data\" : {\"seatcode\":\"8025\"} }"; Json::Reader reader; Json::Value valRoot; std::string strInput; strInput = t_resp; if (!reader.parse(strInput, valRoot)) // reader将Json字符串解析到root,root将包含Json里所有子元素 { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, Json 解析失败 [%s]"), Info, strInput); return m_FailPos; } int nRet = CELL_OP_ERROR; // 执行的返回值 if (valRoot["state"].asString() != "success") { nRet = m_FailPos; return nRet; } nRet = m_SuccessPos; //Json::Value dataV; if (!reader.parse(valRoot["data"].toStyledString(), valRoot)) // reader将Json字符串解析到dataV,dataV将包含Json里所有子元素 { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, Json 解析失败 [%s]"), Info, strInput); return m_FailPos; } if (m_IsSaveRs) // 需要记录集 { Json::Value::Members members; members = valRoot.getMemberNames(); // 获取所有key的值 for (Json::Value::Members::iterator iterMember = members.begin(); iterMember != members.end(); iterMember++) // 遍历每个key { CString value; std::string strKey = *iterMember; if (valRoot[strKey.c_str()].isString()) { CString strVal = valRoot[strKey.c_str()].asCString(); std::cout << strKey.c_str() << ":" << strVal << std::endl; cout << "字符串" << endl; RS.AddTail(strVal); } else if (valRoot[strKey.c_str()].isInt()) { int iVal = valRoot[strKey.c_str()].asInt(); value.Format("%d", iVal); std::cout << strKey.c_str() << ":" << iVal << std::endl; cout << "int" << endl; RS.AddTail(value); } else if (valRoot[strKey.c_str()].isDouble()) { double dVal = valRoot[strKey.c_str()].asDouble(); value.Format("%lf", dVal); std::cout << strKey.c_str() << ":" << value << std::endl; cout << "double" << endl; RS.AddTail(value); } else { std::string strVal = valRoot[strKey.c_str()].toStyledString(); std::cout << strKey.c_str() << ":" << strVal.c_str() << std::endl; } } ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]结束, HttpStr = %s, 接口中查到记录"), Info, t_Url); } else //不需要记录集 { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]结束, Http_Str = %s"), Info, t_Url); nRet = m_FailPos; } return nRet; } CCellBase * CCellHttpClient::copy(void) { cout << "CCellHttpClient::copy(void)" << endl; CCellBase *pCellBase = new CCellHttpClient(*this); return pCellBase; } bool CCellHttpClient::fillData(IFlowDataProvider & Provider) { cout << "CCellHttpClient::fillData(IFlowDataProvider & Provider)" << endl; CString Data; do { cout << "CCellHttpClient::fillData(IFlowDataProvider & Provider) 内部" << endl; if (!Provider.getData(CELL_ATTRIBUTE_POS, Data)) { Data = _T("节点号"); break; } else { sscanf_s(Data, _T("%d"), &m_Pos); if (m_Pos < 1) { Data = _T("节点号"); break; } } if (!Provider.getData(CELL_ATTRIBUTE_HTTPSTR, m_Url)) // 2019-8-14 { Data = _T("HTTP接口网址"); break; } if (!Provider.getData(CELL_ATTRIBUTE_SAVE_FLAG, Data)) { Data = _T("保存标志"); break; } else { if (Data == DATA_BOOL_YES) m_IsSaveRs = true; else m_IsSaveRs = false; } if (!Provider.getData(CELL_ATTRIBUTE_SUCCESS_POS, Data)) { Data = _T("成功跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_SuccessPos); if (m_SuccessPos < 0) { Data = _T("成功跳转节点"); break; } } if (!Provider.getData(CELL_ATTRIBUTE_FAIL_POS, Data)) { Data = _T("失败跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_FailPos); if (m_FailPos < 0) { Data = _T("失败跳转节点"); break; } } Provider.getData(CELL_ATTRIBUTE_NOTE, m_Note); return true; } while (false); ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Cell}: 节点[%s]解析失败, '%s'错误"), CELL_NAME_HTTP, Data); return false; }