kucoin_swap_rest.rs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. // use std::collections::BTreeMap;
  2. // use reqwest::header::HeaderMap;
  3. // use hmac::{Hmac, Mac, NewMac};
  4. // use reqwest::{Client};
  5. // use rust_decimal::Decimal;
  6. // use rust_decimal::prelude::FromPrimitive;
  7. // use rust_decimal_macros::dec;
  8. // use sha2::Sha256;
  9. // use tracing::{info, trace};
  10. // use crate::http_tool::RestTool;
  11. // use crate::response_base::ResponseData;
  12. //
  13. // #[derive(Clone, Debug)]
  14. // pub struct KucoinSwapRest {
  15. // pub label: String,
  16. // base_url: String,
  17. // client: reqwest::Client,
  18. // /*******参数*/
  19. // //是否需要登陆
  20. // //登陆所需参数
  21. // login_param: BTreeMap<String, String>,
  22. // delays: Vec<i64>,
  23. // max_delay: i64,
  24. // avg_delay: Decimal,
  25. // }
  26. //
  27. // impl KucoinSwapRest {
  28. // /*******************************************************************************************************/
  29. // /*****************************************获取一个对象****************************************************/
  30. // /*******************************************************************************************************/
  31. //
  32. // pub fn new(is_colo: bool, login_param: BTreeMap<String, String>) -> KucoinSwapRest
  33. // {
  34. // return KucoinSwapRest::new_label("default-KucoinSwapRest".to_string(), is_colo, login_param);
  35. // }
  36. // pub fn new_label(label: String, is_colo: bool, login_param: BTreeMap<String, String>) -> KucoinSwapRest {
  37. // let base_url = if is_colo {
  38. // "https://api-futures.kucoin.com".to_string()
  39. // } else {
  40. // "https://api-futures.kucoin.com".to_string()
  41. // };
  42. //
  43. // if is_colo {
  44. // info!("开启高速(未配置,走普通:{})通道",base_url);
  45. // } else {
  46. // info!("走普通通道:{}",base_url);
  47. // }
  48. // /*****返回结构体*******/
  49. // KucoinSwapRest {
  50. // label,
  51. // base_url,
  52. // client: Client::new(),
  53. // login_param,
  54. // delays: vec![],
  55. // max_delay: 0,
  56. // avg_delay: dec!(0.0),
  57. // }
  58. // }
  59. //
  60. // /*******************************************************************************************************/
  61. // /*****************************************rest请求函数********************************************************/
  62. // /*******************************************************************************************************/
  63. // pub async fn get_server_time(&mut self) -> ResponseData {
  64. // let params = serde_json::json!({
  65. // });
  66. // let data = self.request("GET".to_string(),
  67. // "/api/v1".to_string(),
  68. // "/timestamp".to_string(),
  69. // false,
  70. // params.to_string(),
  71. // ).await;
  72. // data
  73. // }
  74. //
  75. // // 获取成交记录
  76. // pub async fn get_fills(&mut self,
  77. // symbol: String,
  78. // order_id: String,
  79. // side: String,
  80. // start_at: i64,
  81. // end_at: i64,
  82. // page_size: i64,
  83. // ) -> ResponseData {
  84. // let mut params = serde_json::json!({
  85. // "symbol":symbol,
  86. // "pageSize":1000
  87. // });
  88. // if order_id.len() > 0 {
  89. // params["orderId"] = serde_json::json!(order_id);
  90. // }
  91. // if side.len() > 0 {
  92. // params["side"] = serde_json::json!(side);
  93. // }
  94. // if start_at > 0 {
  95. // params["startAt"] = serde_json::json!(start_at);
  96. // }
  97. // if end_at > 0 {
  98. // params["endAt"] = serde_json::json!(end_at);
  99. // }
  100. // if page_size > 0 {
  101. // params["pageSize"] = serde_json::json!(page_size);
  102. // }
  103. // let data = self.request("GET".to_string(),
  104. // "/api/v1".to_string(),
  105. // "/fills".to_string(),
  106. // true,
  107. // params.to_string(),
  108. // ).await;
  109. // data
  110. // }
  111. // //查询合约账户
  112. // pub async fn get_account(&mut self, contract: String) -> ResponseData {
  113. // let params = serde_json::json!({
  114. // "currency":contract
  115. // });
  116. // let data = self.request("GET".to_string(),
  117. // "/api/v1".to_string(),
  118. // "/account-overview".to_string(),
  119. // true,
  120. // params.to_string(),
  121. // ).await;
  122. // data
  123. // }
  124. // //获取仓位信息
  125. // pub async fn get_position(&mut self, symbol: String) -> ResponseData {
  126. // let params = serde_json::json!({
  127. // "symbol":symbol
  128. // });
  129. // let data = self.request("GET".to_string(),
  130. // "/api/v1".to_string(),
  131. // "/position".to_string(),
  132. // true,
  133. // params.to_string(),
  134. // ).await;
  135. // data
  136. // }
  137. // //查询所有的合约信息
  138. // pub async fn get_market_details(&mut self) -> ResponseData {
  139. // let params = serde_json::json!({});
  140. //
  141. // let data = self.request("GET".to_string(),
  142. // "/api/v1".to_string(),
  143. // format!("/contracts/active"),
  144. // true,
  145. // params.to_string(),
  146. // ).await;
  147. // data
  148. // }
  149. // //实时行情
  150. // pub async fn get_ticker(&mut self, symbol: String) -> ResponseData {
  151. // let params = serde_json::json!({
  152. // "symbol":symbol
  153. // });
  154. // let data = self.request("GET".to_string(),
  155. // "/api/v1".to_string(),
  156. // format!("/ticker"),
  157. // true,
  158. // params.to_string(),
  159. // ).await;
  160. // data
  161. // }
  162. // //查看订单列表
  163. // pub async fn get_orders(&mut self, status: String, symbol: String) -> ResponseData {
  164. // let mut params = serde_json::json!({
  165. // // "symbol":symbol
  166. // });
  167. // if symbol.len() > 0 {
  168. // params.as_object_mut().unwrap().insert("symbol".parse().unwrap(), serde_json::Value::from(symbol));
  169. // }
  170. // if status.len() > 0 {
  171. // params.as_object_mut().unwrap().insert("status".parse().unwrap(), serde_json::Value::from(status));
  172. // }
  173. // trace!("??{}",params.to_string());
  174. // let data = self.request("GET".to_string(),
  175. // "/api/v1".to_string(),
  176. // format!("/orders"),
  177. // true,
  178. // params.to_string(),
  179. // ).await;
  180. // data
  181. // }
  182. // //获取用户仓位列表
  183. // pub async fn get_positions(&mut self, currency: String) -> ResponseData {
  184. // let params = serde_json::json!({
  185. // "currency":currency
  186. // });
  187. // let data = self.request("GET".to_string(),
  188. // "/api/v1".to_string(),
  189. // format!("/positions"),
  190. // true,
  191. // params.to_string(),
  192. // ).await;
  193. // data
  194. // }
  195. // //单个订单详情
  196. // pub async fn get_orders_details(&mut self, order_id: String, client_id: String) -> ResponseData {
  197. // let mut params = serde_json::json!({ });
  198. // let mut url = String::from("");
  199. // if order_id != "" {
  200. // url = format!("/orders/{}", order_id);
  201. // } else if client_id != "" {
  202. // url = format!("/orders/byClientOid");
  203. // params.as_object_mut().unwrap().insert("clientOid".parse().unwrap(), serde_json::Value::from(client_id));
  204. // }
  205. //
  206. // let data = self.request("GET".to_string(),
  207. // "/api/v1".to_string(),
  208. // url,
  209. // true,
  210. // params.to_string(),
  211. // ).await;
  212. // data
  213. // }
  214. // pub async fn swap_order(&mut self, params: serde_json::Value) -> ResponseData {
  215. // let data = self.request("POST".to_string(),
  216. // "/api/v1".to_string(),
  217. // format!("/orders"),
  218. // true,
  219. // params.to_string(),
  220. // ).await;
  221. // data
  222. // }
  223. // //下单
  224. // pub async fn swap_bazaar_order(&mut self,
  225. // client_oid: String,
  226. // symbol: String,
  227. // origin_side: String,
  228. // size: u64,
  229. // leverage: String,
  230. // price: String,
  231. // order_type: String) -> ResponseData
  232. // {
  233. // let mut side = String::from("");
  234. // let mut params = serde_json::json!({
  235. // "clientOid":client_oid,
  236. // "symbol": symbol,
  237. // "size":size,
  238. // "leverage":leverage,
  239. // "reduceOnly":false,
  240. // "price":price,
  241. // "type":order_type,
  242. // });
  243. //
  244. // let req = match origin_side.as_str() {
  245. // "kd" => {
  246. // side = "buy".to_string();
  247. // true
  248. // }
  249. // "pd" => {
  250. // side = "sell".to_string();
  251. // true
  252. // }
  253. // "kk" => {
  254. // side = "sell".to_string();
  255. // true
  256. // }
  257. // "pk" => {
  258. // side = "buy".to_string();
  259. // true
  260. // }
  261. // _ => { false } // 处理未知请求类型
  262. // };
  263. // if req {
  264. // params.as_object_mut().unwrap().insert("side".to_string(), serde_json::json!(side));
  265. // }
  266. //
  267. // let data = self.swap_order(params).await;
  268. // data
  269. // }
  270. //
  271. // //单个撤单
  272. // pub async fn cancel_order(&mut self, order_id: String, client_id: String) -> ResponseData {
  273. // let mut params = serde_json::json!({ });
  274. // let mut url = String::from("");
  275. // if order_id != "" {
  276. // url = format!("/orders/{}", order_id);
  277. // } else if client_id != "" {
  278. // url = format!("/orders/byClientOid");
  279. // params.as_object_mut().unwrap().insert("clientOid".parse().unwrap(), serde_json::Value::from(client_id));
  280. // }
  281. // let data = self.request("DELETE".to_string(),
  282. // "/api/v1".to_string(),
  283. // url,
  284. // true,
  285. // params.to_string(),
  286. // ).await;
  287. // data
  288. // }
  289. // //批量撤单
  290. // pub async fn cancel_orders(&mut self, symbol: String) -> ResponseData {
  291. // let params = serde_json::json!({ });
  292. // let data = self.request("DELETE".to_string(),
  293. // "/api/v1".to_string(),
  294. // format!("/orders?symbol={}", symbol),
  295. // true,
  296. // params.to_string(),
  297. // ).await;
  298. // data
  299. // }
  300. // //全部撤單
  301. // pub async fn cancel_order_all(&mut self) -> ResponseData {
  302. // let params = serde_json::json!({ });
  303. // let data = self.request("DELETE".to_string(),
  304. // "/api/v1".to_string(),
  305. // format!("/orders"),
  306. // true,
  307. // params.to_string(),
  308. // ).await;
  309. // data
  310. // }
  311. //
  312. //
  313. // //获取合约令牌-公共
  314. // pub async fn get_public_token(&mut self) -> ResponseData {
  315. // let params = serde_json::json!({});
  316. // let data = self.request("POST".to_string(),
  317. // "/api/v1".to_string(),
  318. // "/bullet-public".to_string(),
  319. // false,
  320. // params.to_string(),
  321. // ).await;
  322. // data
  323. // }
  324. // //获取合约令牌-私有
  325. // pub async fn get_private_token(&mut self) -> ResponseData {
  326. // let params = serde_json::json!({});
  327. // let data = self.request("POST".to_string(),
  328. // "/api/v1".to_string(),
  329. // "/bullet-private".to_string(),
  330. // true,
  331. // params.to_string(),
  332. // ).await;
  333. // data
  334. // }
  335. // //设置杠杆(修改階梯風險限額等級)
  336. // pub async fn set_leverage(&mut self, symbol: String, level: i8) -> ResponseData {
  337. // let params = serde_json::json!({
  338. // "symbol":symbol,
  339. // "level":level,
  340. // });
  341. // let data = self.request("POST".to_string(),
  342. // "/api/v1".to_string(),
  343. // format!("/position/risk-limit-level/change"),
  344. // true,
  345. // params.to_string(),
  346. // ).await;
  347. // data
  348. // }
  349. // //查看杠杆(查詢杠桿代幣信息)
  350. // pub async fn get_leverage(&mut self, symbol: String) -> ResponseData {
  351. // let params = serde_json::json!({
  352. // });
  353. // let data = self.request("GET".to_string(),
  354. // "/api/v1".to_string(),
  355. // format!("/contracts/risk-limit/{}", symbol),
  356. // true,
  357. // params.to_string(),
  358. // ).await;
  359. // data
  360. // }
  361. // //设置 自动追加保证金
  362. // pub async fn auto_deposit_status(&mut self, symbol: String, status: bool) -> ResponseData {
  363. // let params = serde_json::json!({
  364. // "symbol":symbol,
  365. // "status":status
  366. // });
  367. // let data = self.request("POST".to_string(),
  368. // "/api/v1".to_string(),
  369. // format!("/position/margin/auto-deposit-status"),
  370. // true,
  371. // params.to_string(),
  372. // ).await;
  373. // data
  374. // }
  375. // /*******************************************************************************************************/
  376. // /*****************************************工具函数********************************************************/
  377. // /*******************************************************************************************************/
  378. // pub fn get_delays(&self) -> Vec<i64> {
  379. // self.delays.clone()
  380. // }
  381. // pub fn get_avg_delay(&self) -> Decimal {
  382. // self.avg_delay.clone()
  383. // }
  384. // pub fn get_max_delay(&self) -> i64 {
  385. // self.max_delay.clone()
  386. // }
  387. // fn get_delay_info(&mut self) {
  388. // let last_100 = if self.delays.len() > 100 {
  389. // self.delays[self.delays.len() - 100..].to_vec()
  390. // } else {
  391. // self.delays.clone()
  392. // };
  393. //
  394. // let max_value = last_100.iter().max().unwrap();
  395. // if max_value.clone().to_owned() > self.max_delay {
  396. // self.max_delay = max_value.clone().to_owned();
  397. // }
  398. //
  399. // let sum: i64 = last_100.iter().sum();
  400. // let sum_v = Decimal::from_i64(sum).unwrap();
  401. // let len_v = Decimal::from_u64(last_100.len() as u64).unwrap();
  402. // self.avg_delay = (sum_v / len_v).round_dp(1);
  403. // self.delays = last_100.clone().into_iter().collect();
  404. // }
  405. // //调用请求
  406. // pub async fn request(&mut self,
  407. // method: String,
  408. // prefix_url: String,
  409. // request_url: String,
  410. // is_login: bool,
  411. // params: String) -> ResponseData
  412. // {
  413. // trace!("login_param:{:?}", self.login_param);
  414. // //解析账号信息
  415. // let mut access_key = "".to_string();
  416. // let mut secret_key = "".to_string();
  417. // let mut pass_key = "".to_string();
  418. // if self.login_param.contains_key("access_key") {
  419. // access_key = self.login_param.get("access_key").unwrap().to_string();
  420. // }
  421. // if self.login_param.contains_key("secret_key") {
  422. // secret_key = self.login_param.get("secret_key").unwrap().to_string();
  423. // }
  424. // if self.login_param.contains_key("pass_key") {
  425. // pass_key = self.login_param.get("pass_key").unwrap().to_string();
  426. // }
  427. // let mut is_login_param = true;
  428. // if access_key == "" || secret_key == "" || pass_key == "" {
  429. // is_login_param = false
  430. // }
  431. //
  432. //
  433. // //请求头配置-如果需要登陆则存在额外配置
  434. // let mut body = "".to_string();
  435. //
  436. // let timestamp = chrono::Utc::now().timestamp_millis().to_string();
  437. //
  438. // let mut headers = HeaderMap::new();
  439. // headers.insert("Content-Type", "application/json".parse().unwrap());
  440. // if method == "POST" {
  441. // body = params.clone();
  442. // }
  443. //
  444. // //是否需要登陆-- 组装sing
  445. // if is_login {
  446. // if !is_login_param {
  447. // let e = ResponseData::error(self.label.clone(), "登录参数错误!".to_string());
  448. // return e;
  449. // } else {
  450. // //需要登陆-且登陆参数齐全
  451. // trace!("param:{}", params);
  452. // trace!("body:{}", body);
  453. // //组装sing
  454. // let sing = Self::sign(secret_key.clone(),
  455. // method.clone(),
  456. // prefix_url.clone(),
  457. // request_url.clone(),
  458. // params.clone(),
  459. // body.clone(),
  460. // timestamp.clone(),
  461. // );
  462. // trace!("sing:{}", sing);
  463. // let passphrase = Self::passphrase(secret_key, pass_key);
  464. // trace!("passphrase:{}", passphrase);
  465. // //组装header
  466. // headers.extend(Self::headers(sing, timestamp, passphrase, access_key));
  467. // }
  468. // }
  469. //
  470. //
  471. // // trace!("headers:{:?}", headers);
  472. // let base_url = format!("{}{}", prefix_url.clone(), request_url.clone());
  473. // let start_time = chrono::Utc::now().timestamp_millis();
  474. // let get_response = self.http_tool(
  475. // base_url.clone(),
  476. // method.to_string(),
  477. // params.clone(),
  478. // headers,
  479. // ).await;
  480. // let time_array = chrono::Utc::now().timestamp_millis() - start_time;
  481. // self.delays.push(time_array);
  482. // self.get_delay_info();
  483. // let res_data = Self::res_data_analysis(get_response, base_url, params);
  484. // res_data
  485. // }
  486. //
  487. // pub fn headers(sign: String, timestamp: String, passphrase: String, access_key: String) -> HeaderMap {
  488. // let mut headers = HeaderMap::new();
  489. // headers.insert("KC-API-KEY", access_key.parse().unwrap());
  490. // headers.insert("KC-API-SIGN", sign.parse().unwrap());
  491. // headers.insert("KC-API-TIMESTAMP", timestamp.parse().unwrap());
  492. // headers.insert("KC-API-PASSPHRASE", passphrase.parse().unwrap());
  493. // headers.insert("KC-API-KEY-VERSION", "2".parse().unwrap());
  494. // headers
  495. // }
  496. // pub fn sign(secret_key: String,
  497. // method: String, prefix_url: String, request_url: String,
  498. // params: String, body_data: String, timestamp: String) -> String
  499. // {
  500. // let url = format!("{}{}", prefix_url, request_url);
  501. // let params_str = RestTool::parse_params_to_str(params.clone());
  502. // trace!("body_data:{}", body_data);
  503. // // let body = Some(body_data);
  504. // // let hashed_payload = if let Some(body) = body {
  505. // // let mut m = digest::Context::new(&digest::SHA256);
  506. // // m.update(body.as_bytes());
  507. // // hex::encode(m.finish().as_ref())
  508. // // } else {
  509. // // String::new()
  510. // // };
  511. // // trace!("hashed_payload:{}", hashed_payload);
  512. //
  513. // let mut message = format!("{}{}{}",
  514. // timestamp,
  515. // method,
  516. // url
  517. // );
  518. // if method == "GET" || method == "DELETE" {
  519. // message = if params_str.len() > 0 {
  520. // format!("{}?{}", message, params_str)
  521. // } else {
  522. // format!("{}", message)
  523. // };
  524. // } else if method == "POST" || method == "PUT" {
  525. // message = format!("{}{}", message, body_data);
  526. // }
  527. //
  528. // trace!("**********", );
  529. // trace!("组装数据:{}", message);
  530. // trace!("**********", );
  531. //
  532. // let mut mac = Hmac::<Sha256>::new_varkey(secret_key.as_bytes()).expect("Failed to create HMAC");
  533. // mac.update(message.as_bytes());
  534. // let result = mac.finalize().into_bytes();
  535. // let base64_encoded = base64::encode(result);
  536. // base64_encoded
  537. // }
  538. //
  539. // pub fn passphrase(secret_key: String, pass_key: String) -> String
  540. // {
  541. // let mut mac = Hmac::<Sha256>::new_varkey(secret_key.as_bytes()).expect("Failed to create HMAC");
  542. // mac.update(pass_key.as_bytes());
  543. // let result = mac.finalize().into_bytes();
  544. // let base64_encoded = base64::encode(result);
  545. // base64_encoded
  546. // }
  547. //
  548. //
  549. // async fn http_tool(&mut self, request_path: String, request_type: String, params: String, headers: HeaderMap) -> Result<ResponseData, reqwest::Error> {
  550. // let res_data: ResponseData;
  551. // /****请求接口与 地址*/
  552. // let url = format!("{}{}", self.base_url.to_string(), request_path);
  553. // let request_type = request_type.clone().to_uppercase();
  554. // let addrs_url: String = if RestTool::parse_params_to_str(params.clone()) == "" {
  555. // url.clone()
  556. // } else {
  557. // format!("{}?{}", url.clone(), RestTool::parse_params_to_str(params.clone()))
  558. // };
  559. // trace!("url:{}", url);
  560. // trace!("addrs_url:{}", addrs_url);
  561. //
  562. // let req = match request_type.as_str() {
  563. // "GET" => self.client.get(addrs_url.clone()).headers(headers),
  564. // "POST" => self.client.post(url.clone()).body(params).headers(headers),
  565. // "DELETE" => self.client.delete(addrs_url.clone()).headers(headers),
  566. // // "PUT" => self.client.put(url.clone()).json(&params),
  567. // _ => return Ok(ResponseData::error(self.label.clone(), format!("错误的请求类型:{}", request_type.clone()))), // 处理未知请求类型
  568. // };
  569. //
  570. // let response = req.send().await?;
  571. // if response.status().is_success() {
  572. // // 读取响应的内容
  573. // let body = response.text().await?;
  574. // // trace!("ok-----{}", body);
  575. // res_data = ResponseData::new(self.label.clone(), "200".to_string(), "success".to_string(), body);
  576. // } else {
  577. // let body = response.text().await?;
  578. // // trace!("error-----{}", body);
  579. // res_data = ResponseData::error(self.label.clone(), body.to_string())
  580. // }
  581. //
  582. // Ok(res_data)
  583. // }
  584. //
  585. //
  586. // //res_data 解析
  587. // pub fn res_data_analysis(result: Result<ResponseData, reqwest::Error>, base_url: String, params: String) -> ResponseData {
  588. // match result {
  589. // Ok(res_data) => {
  590. // if res_data.code != "200" {
  591. // // res_data
  592. // let mut error = res_data;
  593. // error.message = format!("错误:{},url:{},相关参数:{}", error.message, base_url, params);
  594. // error
  595. // } else {
  596. // let body: String = res_data.data;
  597. // let json_value: serde_json::Value = serde_json::from_str(&body).unwrap();
  598. //
  599. // let code = json_value["code"].as_str().unwrap();
  600. //
  601. // if code != "200000" {
  602. // let msg = json_value["msg"].as_str().unwrap();
  603. // // let error = ResponseData::new("".to_string(), code.to_string(),
  604. // // format!("错误:{},url:{},相关参数:{}", msg, base_url, params),
  605. // // "".parse().unwrap());
  606. // // error
  607. //
  608. // let mut error = ResponseData::error(res_data.label, msg.parse().unwrap());
  609. // error.code = code.parse().unwrap();
  610. // error.data = format!("请求地址:{},请求参数:{}", base_url, params);
  611. // error
  612. // } else {
  613. // let data = serde_json::to_string(&json_value["data"]).unwrap();
  614. // let success = ResponseData::new("".to_string(), "200".to_string(), "success".to_string(), data.parse().unwrap());
  615. // success
  616. // }
  617. // }
  618. // }
  619. // Err(err) => {
  620. // let error = ResponseData::error("".to_string(), format!("json 解析失败:{},相关参数:{}", err, params));
  621. // error
  622. // }
  623. // }
  624. // }
  625. // }