MiddleWares_YiHe 郑州颐和医院随访系统中间件

CellHttpClient.cpp 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #include "stdafx.h"
  2. #include "CellHttpClient.h"
  3. #include "IvrFlow.h"
  4. #include "FlowDataProvider.h"
  5. #include "json.h"
  6. #include<iostream>
  7. #include<sstream>
  8. using namespace std;
  9. IMPLEMENT_CELL_AUTOCREATE(CCellHttpClient, CELL_NAME_HTTP)
  10. CCellHttpClient::CCellHttpClient()
  11. {
  12. cout << "CCellHttpClient::CCellHttpClient()" << endl;
  13. m_IsSaveRs = 0;
  14. m_SuccessPos = 0;
  15. m_FailPos = 0;
  16. m_Url = "";
  17. }
  18. CCellHttpClient::CCellHttpClient(CCellHttpClient & CellHttpClient) : CCellBase(CellHttpClient)
  19. {
  20. cout << "CCellHttpClient::CCellHttpClient(CCellHttpClient & CellHttpClient)" << endl;
  21. m_IsSaveRs = CellHttpClient.m_IsSaveRs;
  22. m_SuccessPos = CellHttpClient.m_SuccessPos;
  23. m_FailPos = CellHttpClient.m_FailPos;
  24. m_Url = CellHttpClient.m_Url;
  25. //m_RespVar = CellHttpClient.m_RespVar;
  26. }
  27. CCellHttpClient::~CCellHttpClient()
  28. {
  29. cout << "CCellHttpClient::~CCellHttpClient()" << endl;
  30. }
  31. int CCellHttpClient::operate(void)
  32. {
  33. cout << "CCellHttpClient::operate(void)" << endl;
  34. if (m_pIvrFlow == NULL)
  35. return CELL_OP_ERROR;
  36. CString Info;
  37. _getCellInfo(Info);
  38. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 开始执行[%s]"), Info);
  39. CString t_Url;
  40. // 替换url语句中的变量
  41. if (!m_pIvrFlow->replaceVar(m_Url, t_Url))
  42. {
  43. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 替换URL语句中变量失败, URL = %s"), Info, t_Url);
  44. return m_FailPos;
  45. }
  46. DataSet & RS = m_pIvrFlow->recordSet();
  47. RS.RemoveAll();
  48. string t_resp;
  49. CURLcode curlStatus = CHttpUtil::GetInstance().curl_get_req(t_Url.GetBuffer(0), t_resp);
  50. if (CURLE_OK != curlStatus)
  51. {
  52. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, Http访问失败, Curl Error = %d"), Info, curlStatus);
  53. return m_FailPos;
  54. }
  55. cout << t_Url << endl;
  56. cout << t_resp << endl;
  57. cout << "----------------------------------------------" << endl;
  58. // t_resp = "{\"item_key1\":\"item_value1\",\"item_key2\":\"item_value2\",\"item_key3\":\"item_value3\",\"item_key4\":132,\"item_key5\":999999999999999}";
  59. //t_resp = "{ \"state\":\"success\",\"message\" : \"获取最近沟通的坐席\",\"data\" : {\"seatcode\":\"8025\"} }";
  60. Json::Reader reader;
  61. Json::Value valRoot;
  62. std::string strInput;
  63. strInput = t_resp;
  64. if (!reader.parse(strInput, valRoot)) // reader将Json字符串解析到root,root将包含Json里所有子元素
  65. {
  66. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, Json 解析失败 [%s]"), Info, strInput);
  67. return m_FailPos;
  68. }
  69. int nRet = CELL_OP_ERROR; // 执行的返回值
  70. if (valRoot["state"].asString() != "success")
  71. {
  72. nRet = m_FailPos;
  73. return nRet;
  74. }
  75. nRet = m_SuccessPos;
  76. //Json::Value dataV;
  77. if (!reader.parse(valRoot["data"].toStyledString(), valRoot)) // reader将Json字符串解析到dataV,dataV将包含Json里所有子元素
  78. {
  79. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, Json 解析失败 [%s]"), Info, strInput);
  80. return m_FailPos;
  81. }
  82. if (m_IsSaveRs) // 需要记录集
  83. {
  84. Json::Value::Members members;
  85. members = valRoot.getMemberNames(); // 获取所有key的值
  86. for (Json::Value::Members::iterator iterMember = members.begin(); iterMember != members.end(); iterMember++) // 遍历每个key
  87. {
  88. CString value;
  89. std::string strKey = *iterMember;
  90. if (valRoot[strKey.c_str()].isString())
  91. {
  92. CString strVal = valRoot[strKey.c_str()].asCString();
  93. std::cout << strKey.c_str() << ":" << strVal << std::endl;
  94. cout << "字符串" << endl;
  95. RS.AddTail(strVal);
  96. }
  97. else if (valRoot[strKey.c_str()].isInt())
  98. {
  99. int iVal = valRoot[strKey.c_str()].asInt();
  100. value.Format("%d", iVal);
  101. std::cout << strKey.c_str() << ":" << iVal << std::endl;
  102. cout << "int" << endl;
  103. RS.AddTail(value);
  104. }
  105. else if (valRoot[strKey.c_str()].isDouble())
  106. {
  107. double dVal = valRoot[strKey.c_str()].asDouble();
  108. value.Format("%lf", dVal);
  109. std::cout << strKey.c_str() << ":" << value << std::endl;
  110. cout << "double" << endl;
  111. RS.AddTail(value);
  112. }
  113. else
  114. {
  115. std::string strVal = valRoot[strKey.c_str()].toStyledString();
  116. std::cout << strKey.c_str() << ":" << strVal.c_str() << std::endl;
  117. }
  118. }
  119. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]结束, HttpStr = %s, 接口中查到记录"), Info, t_Url);
  120. }
  121. else //不需要记录集
  122. {
  123. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]结束, Http_Str = %s"), Info, t_Url);
  124. nRet = m_FailPos;
  125. }
  126. return nRet;
  127. }
  128. CCellBase * CCellHttpClient::copy(void)
  129. {
  130. cout << "CCellHttpClient::copy(void)" << endl;
  131. CCellBase *pCellBase = new CCellHttpClient(*this);
  132. return pCellBase;
  133. }
  134. bool CCellHttpClient::fillData(IFlowDataProvider & Provider)
  135. {
  136. cout << "CCellHttpClient::fillData(IFlowDataProvider & Provider)" << endl;
  137. CString Data;
  138. do
  139. {
  140. cout << "CCellHttpClient::fillData(IFlowDataProvider & Provider) 内部" << endl;
  141. if (!Provider.getData(CELL_ATTRIBUTE_POS, Data))
  142. {
  143. Data = _T("节点号");
  144. break;
  145. }
  146. else
  147. {
  148. sscanf_s(Data, _T("%d"), &m_Pos);
  149. if (m_Pos < 1)
  150. {
  151. Data = _T("节点号");
  152. break;
  153. }
  154. }
  155. if (!Provider.getData(CELL_ATTRIBUTE_HTTPSTR, m_Url)) // 2019-8-14
  156. {
  157. Data = _T("HTTP接口网址");
  158. break;
  159. }
  160. if (!Provider.getData(CELL_ATTRIBUTE_SAVE_FLAG, Data))
  161. {
  162. Data = _T("保存标志");
  163. break;
  164. }
  165. else
  166. {
  167. if (Data == DATA_BOOL_YES)
  168. m_IsSaveRs = true;
  169. else
  170. m_IsSaveRs = false;
  171. }
  172. if (!Provider.getData(CELL_ATTRIBUTE_SUCCESS_POS, Data))
  173. {
  174. Data = _T("成功跳转节点");
  175. break;
  176. }
  177. else
  178. {
  179. sscanf_s(Data, _T("%d"), &m_SuccessPos);
  180. if (m_SuccessPos < 0)
  181. {
  182. Data = _T("成功跳转节点");
  183. break;
  184. }
  185. }
  186. if (!Provider.getData(CELL_ATTRIBUTE_FAIL_POS, Data))
  187. {
  188. Data = _T("失败跳转节点");
  189. break;
  190. }
  191. else
  192. {
  193. sscanf_s(Data, _T("%d"), &m_FailPos);
  194. if (m_FailPos < 0)
  195. {
  196. Data = _T("失败跳转节点");
  197. break;
  198. }
  199. }
  200. Provider.getData(CELL_ATTRIBUTE_NOTE, m_Note);
  201. return true;
  202. } while (false);
  203. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Cell}: 节点[%s]解析失败, '%s'错误"), CELL_NAME_HTTP, Data);
  204. return false;
  205. }