CZhipuziHttpClient.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include "../pch/pch.h"
  2. #include "CZhipuziHttpClient.h"
  3. #include "rapidjson/document.h"
  4. #include "rapidjson/prettywriter.h"
  5. #include "rapidjson/writer.h"
  6. #include "rapidjson/stringbuffer.h"
  7. using namespace rapidjson;
  8. #include "../helper/MD5.h"
  9. CZhipuziHttpClient CZhipuziHttpClient::m_client;
  10. CZhipuziHttpClient::CZhipuziHttpClient()
  11. {
  12. }
  13. CZhipuziHttpClient::~CZhipuziHttpClient()
  14. {
  15. }
  16. void CZhipuziHttpClient::Init(std::string username, std::string password)
  17. {
  18. m_client.m_username = username;
  19. m_client.m_password = password;
  20. }
  21. bool CZhipuziHttpClient::Login()
  22. {
  23. std::map<string, string> params;
  24. std::string response;
  25. bool ret = m_client.Request("/user/login", params, response);
  26. if (!ret)
  27. {
  28. //网络请求出错
  29. LOG_INFO("network failed!");
  30. return false;
  31. }
  32. LOG_INFO("response:" << response.c_str());
  33. rapidjson::Document document;
  34. document.Parse(response.c_str());
  35. if (!document.IsObject())
  36. {
  37. LOG_INFO("message 非法!");
  38. return false;
  39. }
  40. rapidjson::Value& v_errcode = document["errcode"];
  41. int errcode = v_errcode.GetInt();
  42. if (errcode > 0)
  43. {
  44. LOG_INFO("login failed! message:" << document["errmsg"].GetString());
  45. return false;
  46. }
  47. LOG_INFO("login success!");
  48. return true;
  49. }
  50. bool CZhipuziHttpClient::Request(std::string url, std::map<string, string> params, std::string& response)
  51. {
  52. std::string timestamp = to_string(time(NULL));
  53. std::string nonce = "123456";
  54. std::string machinecode = "e6bc5694877b2aec";
  55. //先添加默认参数,用于计算签名
  56. params["username"] = m_username;
  57. params["timestamp"] = timestamp;
  58. params["nonce"] = nonce;
  59. params["machinecode"] = machinecode;
  60. params["url"] = m_url + url;
  61. //计算签名
  62. std::string postString;
  63. for (std::map<string, string>::iterator it = params.begin(); it != params.end(); )
  64. {
  65. postString += it->first + "=" + it->second;
  66. it++;
  67. if (it != params.end())
  68. {
  69. postString += "&";
  70. }
  71. }
  72. //LOG_INFO("postString:" << postString.c_str());
  73. std::string key = md5(m_password);
  74. transform(key.begin(), key.end(), key.begin(), ::toupper);
  75. //用于计算签名的临时变量
  76. std::string tmp = postString + key;
  77. string sign = md5(tmp);
  78. transform(sign.begin(), sign.end(), sign.begin(), ::toupper);
  79. //LOG_INFO("sign:" << sign.c_str());
  80. //加上签名,去掉url,计算post
  81. params["sign"] = sign;
  82. params.erase("url");
  83. postString = "";
  84. for (std::map<string, string>::iterator it = params.begin(); it != params.end(); )
  85. {
  86. postString += it->first + "=" + it->second;
  87. it++;
  88. if (it != params.end())
  89. {
  90. postString += "&";
  91. }
  92. }
  93. //LOG_INFO("postString:" << postString.c_str());
  94. int ret = m_httpClient.Posts(m_url + url, postString, response, NULL);
  95. //LOG_INFO("response:" << response.c_str());
  96. if (!ret)
  97. {
  98. //ret为0表示没有出错
  99. return true;
  100. }
  101. return false;
  102. /*
  103. rapidjson::Document doc;
  104. doc.SetObject();
  105. rapidjson::Document::AllocatorType &allocator = doc.GetAllocator(); //获取分配器
  106. doc.AddMember(rapidjson::StringRef("useranme"), rapidjson::StringRef(m_username.c_str()), allocator);
  107. doc.AddMember(rapidjson::StringRef("timestamp"), rapidjson::StringRef(timestamp.c_str()), allocator);
  108. doc.AddMember(rapidjson::StringRef("nonce"), rapidjson::StringRef(nonce.c_str()), allocator);
  109. doc.AddMember(rapidjson::StringRef("machinecode"), rapidjson::StringRef(machinecode.c_str()), allocator);
  110. rapidjson::StringBuffer buffer;
  111. rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
  112. doc.Accept(writer);
  113. std::string json = std::string(buffer.GetString());
  114. LOG_INFO("json:" << json.c_str());*/
  115. }