ApiTestHelper.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. using System.Security.Cryptography;
  2. using System.Text;
  3. using System.Text.RegularExpressions;
  4. using Common;
  5. using LitJson;
  6. using Model;
  7. using Vo.Admin;
  8. namespace Util.Logic
  9. {
  10. public class ApiTestHelper
  11. {
  12. /// <summary>
  13. /// API源请求节点
  14. /// </summary>
  15. /// <param name="apiInfoData">接口数据</param>
  16. /// <param name="requestEncrypt">加密方式</param>
  17. /// <param name="requestEncryptParam">加密参数</param>
  18. /// <param name="requestParams">请求参数</param>
  19. /// <param name="responseParams">响应参数</param>
  20. /// <returns>HTTP响应</returns>
  21. public static string apiTestRequest(ApiTreeInfo apiInfoData, string requestEncrypt, string requestEncryptParam, Dictionary<string, string> requestParams, Dictionary<string, string> headers)
  22. {
  23. // 收集请求参数
  24. Dictionary<string, string> requestParamsDict = new Dictionary<string, string>();
  25. foreach (var param in requestParams)
  26. {
  27. string label = param.Key;
  28. string value = param.Value;
  29. requestParamsDict.Add(label, value);
  30. }
  31. string requestMethod = apiInfoData.apiMethod; // HTTP方法
  32. string requestUrl = apiInfoData.apiPath; // HTTP请求URL
  33. Utils.WriteLog("请求地址:" + requestUrl, "请求接口");
  34. Utils.WriteLog("请求方式:" + requestMethod, "请求接口");
  35. string response = ""; // HTTP响应
  36. if (requestMethod == "GET") // GET请求
  37. {
  38. // 处理GET请求参数
  39. string requestParamString = Newtonsoft.Json.JsonConvert.SerializeObject(requestParamsDict);
  40. Utils.WriteLog("请求参数:" + requestParamString, "请求接口");
  41. if (requestEncrypt != "NO")
  42. {
  43. requestParamString = Encrypt(requestParamString, requestEncrypt, requestEncryptParam);
  44. response += requestParamString + "|";
  45. }
  46. Utils.WriteLog("请求参数:" + requestParamString, "请求接口");
  47. response += Function.GetWebRequest(requestUrl + "?value=" + requestParamString, headers, true); // 发送GET请求
  48. }
  49. else if (requestMethod == "POST" || requestMethod == "PUT") // POST/PUT请求
  50. {
  51. // 处理POST/PUT请求参数
  52. string requestBody = Newtonsoft.Json.JsonConvert.SerializeObject(requestParamsDict);
  53. Utils.WriteLog("请求参数:" + requestBody, "请求接口");
  54. if (requestEncrypt != "NO")
  55. {
  56. requestBody = Encrypt(requestBody, requestEncrypt, requestEncryptParam);
  57. response += requestBody + "|";
  58. }
  59. Utils.WriteLog("请求参数:" + requestBody, "请求接口");
  60. response += Function.PostWebRequest(requestUrl, requestBody, headers, requestMethod, "application/json", true); // 发送POST/PUT请求
  61. }
  62. else if (requestMethod == "DELETE") // DELETE请求
  63. {
  64. // 处理DELETE请求参数
  65. string requestValue = "0";
  66. if(requestParamsDict.Keys.Count > 0)
  67. {
  68. requestValue = requestParamsDict[requestParamsDict.Keys?.FirstOrDefault() ?? ""];
  69. }
  70. Utils.WriteLog("请求参数:" + requestValue, "请求接口");
  71. if (requestEncrypt != "NO")
  72. {
  73. requestValue = Encrypt(requestValue, requestEncrypt, requestEncryptParam);
  74. response += requestValue + "|";
  75. }
  76. Utils.WriteLog("请求参数:" + requestValue, "请求接口");
  77. requestUrl = Regex.Replace(requestUrl, "\\{.*?\\}", requestValue);
  78. Utils.WriteLog("请求地址:" + requestUrl, "请求接口");
  79. response += Function.DeleteWithBody(requestUrl, "", headers, true); // 发送DELETE请求
  80. }
  81. Utils.WriteLog("返回数据:" + response, "请求接口");
  82. // 处理POST/PUT请求响应
  83. return response;
  84. }
  85. /// <summary>
  86. /// 加密
  87. /// </summary>
  88. /// <param name="str">待加密字符串</param>
  89. /// <param name="encryptType">加密类型</param>
  90. /// <param name="encryptParam">加密参数</param>
  91. /// <returns>加密后字符串</returns>
  92. private static string Encrypt(string str, string encryptType, string encryptParam)
  93. {
  94. if (encryptType == "AES")
  95. {
  96. JsonData jsonData = JsonMapper.ToObject(encryptParam);
  97. return AesEncrypt(str, jsonData["key"].ToString(), jsonData["iv"].ToString(), jsonData["mode"].ToString(), jsonData["padding"].ToString());
  98. }
  99. else if (encryptType == "RSA")
  100. {
  101. JsonData jsonData = JsonMapper.ToObject(encryptParam);
  102. return RsaEncrypt(str, jsonData["key"].ToString(), jsonData["kind"].ToString());
  103. }
  104. else if (encryptType == "DES")
  105. {
  106. JsonData jsonData = JsonMapper.ToObject(encryptParam);
  107. return Dbconn.DesEncrypt(str, jsonData["key"].ToString());
  108. }
  109. return "";
  110. }
  111. /// <summary>
  112. /// AES加密
  113. /// </summary>
  114. /// <param name="str">待加密字符串</param>
  115. /// <param name="key">密钥</param>
  116. /// <param name="iv">初始向量</param>
  117. /// <param name="mode">加密模式</param>
  118. /// <param name="padding">填充方式</param>
  119. /// <returns>加密后字符串</returns>
  120. public static string AesEncrypt(string str, string key, string iv, string mode = "CBC", string padding = "PKCS7")
  121. {
  122. if (string.IsNullOrEmpty(str)) return null;
  123. Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
  124. CipherMode cipherMode = CipherMode.CBC;
  125. PaddingMode paddingMode = PaddingMode.PKCS7;
  126. if (mode == "CBC") cipherMode = CipherMode.CBC;
  127. if (mode == "ECB") cipherMode = CipherMode.ECB;
  128. if (mode == "CFB") cipherMode = CipherMode.CFB;
  129. if (mode == "CTS") cipherMode = CipherMode.CTS;
  130. if (padding == "PKCS7") paddingMode = PaddingMode.PKCS7;
  131. if (padding == "None") paddingMode = PaddingMode.None;
  132. if (padding == "Zeros") paddingMode = PaddingMode.Zeros;
  133. if (padding == "ISO10126") paddingMode = PaddingMode.ISO10126;
  134. if (padding == "ANSIX923") paddingMode = PaddingMode.ANSIX923;
  135. System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
  136. {
  137. Key = Encoding.UTF8.GetBytes(key),
  138. IV = Encoding.UTF8.GetBytes(iv),
  139. Mode = cipherMode,
  140. Padding = paddingMode
  141. };
  142. System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateEncryptor();
  143. Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
  144. string jsonData = Convert.ToBase64String(resultArray, 0, resultArray.Length);
  145. return Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonData));
  146. }
  147. public static string RsaEncrypt(string data, string key, string kind)
  148. {
  149. if (kind == "privateKey")
  150. {
  151. var toDecryptArray = Convert.FromBase64String(data);
  152. var toKey = Convert.FromBase64String(key);
  153. var rsa = RSA.Create();
  154. rsa.ImportPkcs8PrivateKey(toKey, out _);
  155. var encryptData = rsa.Encrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1);
  156. var result = Convert.ToBase64String(encryptData);
  157. return result;
  158. }
  159. else if (kind == "publicKey")
  160. {
  161. var toDecryptArray = Convert.FromBase64String(data);
  162. var toKey = Convert.FromBase64String(key);
  163. var rsa = RSA.Create();
  164. rsa.ImportRSAPublicKey(toKey, out _);
  165. var encryptData = rsa.Encrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1);
  166. var result = Convert.ToBase64String(encryptData);
  167. return result;
  168. }
  169. if (kind == "privateKey2")
  170. {
  171. return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, key).Encrypt(data);
  172. }
  173. else if (kind == "publicKey2")
  174. {
  175. return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, "", key).Encrypt(data);
  176. }
  177. return "";
  178. }
  179. /// <summary>
  180. /// 解密
  181. /// </summary>
  182. /// <param name="str">待解密字符串</param>
  183. /// <param name="decryptType">解密类型</param>
  184. /// <param name="decryptParam">解密参数</param>
  185. /// <returns>解密后字符串</returns>
  186. private static string Decrypt(string str, string decryptType, string decryptParam)
  187. {
  188. if (decryptType == "AES")
  189. {
  190. JsonData jsonData = JsonMapper.ToObject(decryptParam);
  191. return AesDecrypt(str, jsonData["key"].ToString(), jsonData["iv"].ToString(), jsonData["mode"].ToString(), jsonData["padding"].ToString());
  192. }
  193. else if (decryptType == "RSA")
  194. {
  195. JsonData jsonData = JsonMapper.ToObject(decryptParam);
  196. return RsaDecrypt(str, jsonData["key"].ToString(), jsonData["kind"].ToString());
  197. }
  198. else if (decryptType == "DES")
  199. {
  200. JsonData jsonData = JsonMapper.ToObject(decryptParam);
  201. return Dbconn.DesDecrypt(str, jsonData["key"].ToString());
  202. }
  203. return "";
  204. }
  205. /// <summary>
  206. /// AES解密
  207. /// </summary>
  208. /// <param name="str">待解密字符串</param>
  209. /// <param name="key">密钥</param>
  210. /// <param name="iv">初始向量</param>
  211. /// <param name="mode">解密模式</param>
  212. /// <param name="padding">填充方式</param>
  213. /// <returns>解密后字符串</returns>
  214. public static string AesDecrypt(string str, string key, string iv, string mode = "CBC", string padding = "PKCS7")
  215. {
  216. if (string.IsNullOrEmpty(str)) return null;
  217. Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
  218. CipherMode cipherMode = CipherMode.CBC;
  219. PaddingMode paddingMode = PaddingMode.PKCS7;
  220. if (mode == "CBC") cipherMode = CipherMode.CBC;
  221. if (mode == "ECB") cipherMode = CipherMode.ECB;
  222. if (mode == "CFB") cipherMode = CipherMode.CFB;
  223. if (mode == "CTS") cipherMode = CipherMode.CTS;
  224. if (padding == "PKCS7") paddingMode = PaddingMode.PKCS7;
  225. if (padding == "None") paddingMode = PaddingMode.None;
  226. if (padding == "Zeros") paddingMode = PaddingMode.Zeros;
  227. if (padding == "ISO10126") paddingMode = PaddingMode.ISO10126;
  228. if (padding == "ANSIX923") paddingMode = PaddingMode.ANSIX923;
  229. System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
  230. {
  231. Key = Encoding.UTF8.GetBytes(key),
  232. IV = Encoding.UTF8.GetBytes(iv),
  233. Mode = cipherMode,
  234. Padding = paddingMode
  235. };
  236. System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor();
  237. Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
  238. return Encoding.UTF8.GetString(resultArray);
  239. }
  240. public static string RsaDecrypt(string data, string key, string kind)
  241. {
  242. if (kind == "privateKey")
  243. {
  244. var toDecryptArray = Convert.FromBase64String(data);
  245. var toKey = Convert.FromBase64String(key);
  246. var rsa = RSA.Create();
  247. rsa.ImportPkcs8PrivateKey(toKey, out _);
  248. var encryptData = rsa.Decrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1);
  249. var result = Convert.ToBase64String(encryptData);
  250. return result;
  251. }
  252. else if (kind == "publicKey")
  253. {
  254. var toDecryptArray = Convert.FromBase64String(data);
  255. var toKey = Convert.FromBase64String(key);
  256. var rsa = RSA.Create();
  257. rsa.ImportRSAPublicKey(toKey, out _);
  258. var encryptData = rsa.Decrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1);
  259. var result = Convert.ToBase64String(encryptData);
  260. return result;
  261. }
  262. if (kind == "privateKey2")
  263. {
  264. return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, key).Decrypt(data);
  265. }
  266. else if (kind == "publicKey2")
  267. {
  268. return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, "", key).Decrypt(data);
  269. }
  270. return "";
  271. }
  272. }
  273. }