/// <summary> /// 执行公开API请求。 /// </summary> /// <typeparam name="T">领域对象</typeparam> /// <param name="request">具体的API请求</param> /// <returns>领域对象</returns> public T Execute <T>(IRequest <T> request) where T : IResponse { // 添加系统级请求参数 SdkDictionary txtParams = new SdkDictionary(request.GetParameters()); txtParams.Add("method", request.GetApiNameOrUrl()); txtParams.Add("timestamp", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); txtParams.Add("format", "xml"); txtParams.Add("app_key", this._apiKey); txtParams.Add("v", "1.0"); txtParams.Add("sign_method", "md5"); txtParams.Add("session", this._sessionKey); // 添加签名参数 SdkDictionary signParams = new SdkDictionary(); signParams.Add("app_key", _apiKey); signParams.Add("format", "xml"); signParams.Add("method", request.GetApiNameOrUrl()); signParams.Add("session", this._sessionKey); signParams.Add("sign_method", "md5"); signParams.Add("timestamp", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); //signParams.Add("secret", _appSecret); signParams.Add("v", "1.0"); txtParams.Add("sign", SignRequest(signParams, _appSecret)); // 是否需要上传文件 string body; WebUtils webUtils = new WebUtils(); webUtils.Charset = "GBK"; if (request is IUploadRequest <T> ) { IUploadRequest <T> uRequest = (IUploadRequest <T>)request; IDictionary <string, FileItem> fileParams = Utils.CleanupDictionary(uRequest.GetFileParameters()); body = webUtils.DoPost(_appUrl, txtParams, fileParams); } else { body = webUtils.DoGet(_appUrl, txtParams); } T rsp; IParser <T> tp = new XmlParser <T>(); rsp = tp.Parse(body, Encoding.GetEncoding("GBK")); return(rsp); }
public T Execute <T>(IRequest <T> request, string session, string appAuthToken) where T : IResponse { // 构造请求参数 ParamDictionary requestParams = buildRequestParams(request, session, appAuthToken); // 字典排序 IDictionary <string, string> sortedParams = new SortedDictionary <string, string>(requestParams); ParamDictionary sortedDic = new ParamDictionary(sortedParams); // 参数签名 string charset = string.IsNullOrEmpty(this.charset) ? "utf-8" : this.charset; //string signResult = Signature.RSASign(sortedDic, privateKeyPem, charset, this.keyFromFile, this.signType); //// 添加签名结果参数 //sortedDic.Add(SIGN, signResult); // 参数拼接 string signedResult = WebUtils.BuildQuery(sortedDic, charset); var txtParams = sortedDic; // 是否需要上传文件 string body; string requestBody = null; string url = ""; // this.serverUrl + "?" + CHARSET + "=" + this.charset; url = GetFullUrl(this.serverUrl, request.GetApiName()); // + "?" + CHARSET + "=" + this.charset; if (request is IUploadRequest <T> ) { IUploadRequest <T> uRequest = (IUploadRequest <T>)request; IDictionary <string, FileItem> fileParams = SdkUtils.CleanupDictionary(uRequest.GetFileParameters()); body = webUtils.DoPost(url, txtParams, fileParams, this.charset, out requestBody); } else { body = webUtils.DoPost(url, txtParams, this.charset, out requestBody); } T rsp = null; IParser <T> parser = null; if ("xml".Equals(format)) { parser = new XmlParser <T>(); rsp = parser.Parse(body, charset); } else { parser = new JsonParser <T>(); rsp = parser.Parse(body, charset); } ResponseParseItem item = parseRespItem(request, body, parser, this.encyptKey, this.encyptType, charset); rsp = parser.Parse(item.realContent, charset); rsp.RequestBody = requestBody; CheckResponseSign(request, item.respContent, rsp.IsError, parser, this.publicKey, this.charset, signType, this.keyFromFile); return(rsp); }
private T DoExecute <T>(IRequest <T> request, string session, DateTime timestamp) where T : ResponseBase { long start = DateTime.Now.Ticks; // 提前检查业务参数 try { request.Validate(); } catch (CException e) { return(CreateErrorResponse <T>(e.ErrorCode, e.ErrorMsg)); } CDictionary txtParams = new CDictionary(request.GetParameters()); txtParams.Add(Constants.METHOD, request.GetApiName); InitParameters(txtParams); // 添加协议级请求参数 //ACDictionary txtParams = new ACDictionary(request.GetParameters()); //txtParams.Add(Constants.METHOD, request.GetApiName()); //txtParams.Add(Constants.VERSION, "1.0"); ////txtParams.Add(Constants.SIGN_METHOD, Constants.SIGN_METHOD_MD5); //txtParams.Add(Constants.APP_KEY, appKey); //txtParams.Add(Constants.FORMAT, format); //txtParams.Add(Constants.TIMESTAMP, timestamp); //txtParams.AddAll(this.systemParameters); //// 添加签名参数 //txtParams.Add(Constants.SIGN, SignHelper.SignACRequest(txtParams, appSecret, Constants.SIGN_METHOD_MD5)); // 添加头部参数 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 IUploadRequest <T> ) // 是否需要上传文件 { IUploadRequest <T> uRequest = (IUploadRequest <T>)request; IDictionary <string, FileItem> fileParams = SignHelper.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.ResponseBody = body; } else { if (Constants.FORMAT_XML.Equals(format)) { IParser <T> tp = new XmlParser <T>(); rsp = tp.Parse(body); } else { IParser <T> tp; if (useSimplifyJson) { tp = new AcSimplifyJsonParser <T>(); } else { tp = new JsonParser <T>(); } rsp = tp.Parse(body); } } // 追踪错误的请求 if (!rsp.HaveError) { TimeSpan latency = new TimeSpan(DateTime.Now.Ticks - start); TraceApiError(AppKey, request.GetApiName, serverUrl, txtParams, latency.TotalMilliseconds, rsp.ResponseBody); } 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; } }