private T DoExecute <T>(ITopRequest <T> request, string session, DateTime timestamp) where T : TopResponse { long start = DateTime.Now.Ticks; // 提前检查业务参数 try { request.Validate(); } catch (TopException e) { return(CreateErrorResponse <T>(e.ErrorCode, e.ErrorMsg)); } // 添加协议级请求参数 TopDictionary txtParams = new TopDictionary(request.GetParameters()); txtParams.Add(Constants.METHOD, request.GetApiName()); txtParams.Add(Constants.VERSION, "2.0"); txtParams.Add(Constants.SIGN_METHOD, Constants.SIGN_METHOD_HMAC); txtParams.Add(Constants.APP_KEY, appKey); txtParams.Add(Constants.FORMAT, format); txtParams.Add(Constants.PARTNER_ID, GetSdkVersion()); txtParams.Add(Constants.TIMESTAMP, timestamp); txtParams.Add(Constants.TARGET_APP_KEY, request.GetTargetAppKey()); txtParams.Add(Constants.SESSION, session); txtParams.AddAll(this.systemParameters); if (this.useSimplifyJson) { txtParams.Add(Constants.SIMPLIFY, "true"); } // 添加签名参数 txtParams.Add(Constants.SIGN, TopUtils.SignTopRequest(txtParams, appSecret, Constants.SIGN_METHOD_HMAC)); // 添加头部参数 if (this.useGzipEncoding) { request.GetHeaderParameters()[Constants.ACCEPT_ENCODING] = Constants.CONTENT_ENCODING_GZIP; } string realServerUrl = GetServerUrl(this.serverUrl, request.GetApiName(), session); string reqUrl = WebUtils.BuildRequestUrl(realServerUrl, txtParams); try { string body; if (request is ITopUploadRequest <T> ) // 是否需要上传文件 { ITopUploadRequest <T> uRequest = (ITopUploadRequest <T>)request; IDictionary <string, FileItem> fileParams = TopUtils.CleanupDictionary(uRequest.GetFileParameters()); body = webUtils.DoPost(realServerUrl, txtParams, fileParams, request.GetHeaderParameters()); } else { body = webUtils.DoPost(realServerUrl, txtParams, request.GetHeaderParameters()); } // 解释响应结果 T rsp; if (disableParser) { rsp = Activator.CreateInstance <T>(); rsp.Body = body; } else { if (Constants.FORMAT_XML.Equals(format)) { ITopParser <T> tp = new TopXmlParser <T>(); rsp = tp.Parse(body); } else { ITopParser <T> tp; if (useSimplifyJson) { tp = new TopSimplifyJsonParser <T>(); } else { tp = new TopJsonParser <T>(); } rsp = tp.Parse(body); } } // 追踪错误的请求 if (rsp.IsError) { TimeSpan latency = new TimeSpan(DateTime.Now.Ticks - start); TraceApiError(appKey, request.GetApiName(), serverUrl, txtParams, latency.TotalMilliseconds, rsp.Body); } return(rsp); } catch (Exception e) { TimeSpan latency = new TimeSpan(DateTime.Now.Ticks - start); TraceApiError(appKey, request.GetApiName(), serverUrl, txtParams, latency.TotalMilliseconds, e.GetType() + ": " + e.Message); throw e; } }
/// <summary> /// 把JSON解释为API响应对象。 /// </summary> /// <typeparam name="T">API响应类型</typeparam> /// <param name="json">JSON字符串</param> /// <returns>API响应对象</returns> public static T ParseResponse <T>(string json) where T : TopResponse { TopJsonParser <T> parser = new TopJsonParser <T>(); return(parser.Parse(json)); }