接口调用

private static readonly string ServiceUrl = ConfigurationManager.AppSettings["ServiceUrl"];
/// <summary>
/// 字符编码
/// </summary>
private readonly Encoding _DefaultEncoding = Encoding.UTF8;

/// <summary>
/// 发送请求,获取返回值
/// </summary>
/// <param name="requestData">请求对象</param>
/// <returns></returns>
public CheckResponse GetCheckResponse(string url, CheckPersonInfoInput requestData)
{
string postString = GetFormStr(requestData);

//string json = JsonHelper.ObjectToJson(requestData);//完整参数
byte[] bs = _DefaultEncoding.GetBytes(postString);
string requsetUrl = ServiceUrl  + url;

//创建http请求
HttpWebRequest webRequest = CreateHttpWebRequest(requsetUrl);
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.ContentLength = bs.Length;
using (Stream reqStream = webRequest.GetRequestStream())
{
reqStream.Write(bs, 0, bs.Length);
}

HttpWebResponse webResponse;
try
{
//获取响应
webResponse = (HttpWebResponse)webRequest.GetResponse();
}
catch (WebException ex)
{
//返回值非200 会有异常
//若服务端在调用不成功时,会修改响应status,需要在这里获取HttpWebResponse
//webResponse = (HttpWebResponse)ex.Response;

throw new ApiException("002", "调用接口错误:" + ex.Status + " " + ex.Message);
}

Stream responseStream = webResponse.GetResponseStream();

if (webResponse.ContentEncoding.ToLower().Contains("gzip"))
{
//gzip格式
responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
}
string responseString = "";
using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))
{
responseString = reader.ReadToEnd();
}
if (responseString != null && responseString.Length > 0)
{
CheckResponse responseObj = JsonHelper.JsonToObject<CheckResponse>(responseString);

if (responseObj.respCode == "0000"|| responseObj.respCode == "0001")
{
return responseObj;
}
else
{
throw new ApiException("001", responseObj.resTxnId);
}
}
else
{
throw new Exception("调用接口错误,没有返回值");
}
}

 

/// <summary>
/// 创建请求
/// </summary>
/// <param name="url">地址</param>
/// <returns></returns>
private static HttpWebRequest CreateHttpWebRequest(string url)
{
HttpWebRequest request;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
//ServicePointManager.DefaultConnectionLimit = 1000;
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version11;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Proxy = null;
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");//若支持压缩 注意需要给在获取响应时解压
return request;
}

/// <summary>
/// https 校验证书
/// </summary>
/// <param name="sender"></param>
/// <param name="certificate"></param>
/// <param name="chain"></param>
/// <param name="errors"></param>
/// <returns></returns>
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
//todo 验证对方证书
return true; //总是接受
}

private static string GetFormStr(CheckPersonInfoInput input)
{
string postString = "";
StringBuilder sb = new StringBuilder();
Type t = input.GetType();//获得该类的Type

foreach (var pi in t.GetProperties())
{
var name = pi.Name;//获得属性的名字,后面就可以根据名字判断来进行些自己想要的操作
var value = pi.GetValue(input, null);//用pi.GetValue获得值
sb.AppendFormat("{0}={1}", name, value);
sb.Append("&");
}
postString = sb.ToString().Trim('&');
return postString;
}

posted @ 2020-03-25 11:31  紫心落  阅读(167)  评论(0编辑  收藏  举报