1、先创建发起请求的类
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
namespace GraspFx.Web.Core.SureWin.HeiHu
{
public class WebUtils
{
private int _timeout = 100000;
public int Timeout
{
get
{
return this._timeout;
}
set
{
this._timeout = value;
}
}
public string DoPost(string url, string data)
{
HttpWebRequest webRequest = this.GetWebRequest(url, "POST");
webRequest.ContentType = "application/json;charset=utf-8";
byte[] bytes = Encoding.UTF8.GetBytes(data);
Stream requestStream = webRequest.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
try
{
HttpWebResponse httpWebResponse = (HttpWebResponse)webRequest.GetResponse();
Encoding encoding = Encoding.GetEncoding("UTF-8");
if (httpWebResponse.CharacterSet != null)
{
encoding = Encoding.GetEncoding(httpWebResponse.CharacterSet);
}
return this.GetResponseAsString(httpWebResponse, encoding);
}
catch (WebException ex)
{
using (WebResponse response = ex.Response)
{
HttpWebResponse httpResponse = (HttpWebResponse)response;
using (Stream sr = response.GetResponseStream())
using (var reader = new StreamReader(sr))
{
string text = reader.ReadToEnd();
return text;
}
}
}
}
public string DoPost(string url, string data, Dictionary<string, string> headerParam)
{
try
{
HttpWebRequest webRequest = this.GetWebRequest(url, "POST");
webRequest.ContentType = "application/json;charset=utf-8";
foreach (var item in headerParam)
{
webRequest.Headers.Add(item.Key, item.Value);
}
byte[] bytes = Encoding.UTF8.GetBytes(data);
Stream requestStream = webRequest.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
HttpWebResponse httpWebResponse = (HttpWebResponse)webRequest.GetResponse();
Encoding encoding = Encoding.GetEncoding("UTF-8");
if (httpWebResponse.CharacterSet != null)
{
encoding = Encoding.GetEncoding(httpWebResponse.CharacterSet);
}
return this.GetResponseAsString(httpWebResponse, encoding);
}
catch (WebException ex)
{
return ex.Message;
using (WebResponse response = ex.Response)
{
HttpWebResponse httpResponse = (HttpWebResponse)response;
using (Stream sr = response.GetResponseStream())
using (var reader = new StreamReader(sr))
{
string text = reader.ReadToEnd();
return text;
}
}
}
}
public string DoPost(string authorization, string url, string data)
{
HttpWebRequest webRequest = this.GetWebRequest(url, "POST");
webRequest.ContentType = "application/json;charset=utf-8";
webRequest.Headers.Add(HttpRequestHeader.Authorization, authorization);
byte[] bytes = Encoding.UTF8.GetBytes(data);
Stream requestStream = webRequest.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
try
{
HttpWebResponse httpWebResponse = (HttpWebResponse)webRequest.GetResponse();
Encoding encoding = Encoding.GetEncoding("UTF-8");
if (httpWebResponse.CharacterSet != null)
{
encoding = Encoding.GetEncoding(httpWebResponse.CharacterSet);
}
return this.GetResponseAsString(httpWebResponse, encoding);
}
catch (WebException ex)
{
using (WebResponse response = ex.Response)
{
HttpWebResponse httpResponse = (HttpWebResponse)response;
using (Stream sr = response.GetResponseStream())
using (var reader = new StreamReader(sr))
{
string text = reader.ReadToEnd();
return text;
}
}
}
}
public string DoGet(string url)
{
HttpWebRequest webRequest = this.GetWebRequest(url, "GET");
webRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
HttpWebResponse rsp = (HttpWebResponse)webRequest.GetResponse();
Encoding uTF = Encoding.UTF8;
return this.GetResponseAsString(rsp, uTF);
}
public string DoGet(string url, Dictionary<string, string> headerParam)
{
HttpWebRequest webRequest = this.GetWebRequest(url, "GET");
webRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
foreach (var item in headerParam)
{
webRequest.Headers.Add(item.Key, item.Value);
}
HttpWebResponse rsp = (HttpWebResponse)webRequest.GetResponse();
Encoding uTF = Encoding.UTF8;
return this.GetResponseAsString(rsp, uTF);
}
public HttpWebRequest GetWebRequest(string url, string method)
{
HttpWebRequest httpWebRequest;
if (url.Contains("https"))
{
ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
httpWebRequest = (HttpWebRequest)WebRequest.Create(new Uri(url));
//ServicePointManager.ser
//httpWebRequest.Credentials = CredentialCache.DefaultCredentials;
}
else
{
httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
}
httpWebRequest.ServicePoint.Expect100Continue = false;
httpWebRequest.Method = method;
httpWebRequest.KeepAlive = true;
httpWebRequest.Timeout = this._timeout;
return httpWebRequest;
}
public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
//if (sslPolicyErrors == SslPolicyErrors.None) {
// return true;
//}
//Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
Do not allow this client to communicate with unauthenticated servers.
//return false;
return true;
}
public string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
{
Stream stream = null;
StreamReader streamReader = null;
string result;
try
{
stream = rsp.GetResponseStream();
streamReader = new StreamReader(stream, encoding);
result = streamReader.ReadToEnd();
}
finally
{
if (streamReader != null)
{
streamReader.Close();
}
if (stream != null)
{
stream.Close();
}
if (rsp != null)
{
rsp.Close();
}
}
return result;
}
}
}
2、再创建一个调用请求方法的类
using Carpa.Web.Script;
using GraspFx.Web.Core.SureWin.HeiHu;
using GraspFx.Web.Core.SureWin.Helper;
using GraspFx.Web.Core.SureWin.Model;
using GraspFx.Web.Core.SureWin.Model.RequestModel;
using GraspFx.Web.Core.SureWin.Model.ResultModel;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Web;
namespace GraspFx.Web.Core.SureWin
{
public class RequestClient
{
private readonly string tokenCacheKey = "HH-Token";
private readonly string xclient = "lite-web";
private int _time = 1800; //过期时间
private int _minutes = 30; //过期时间
private HeiHuConfig _heihuConfig;
private GjpClient _gjpConfig;
public RequestClient(HeiHuConfig heihuConfig)
{
_heihuConfig = heihuConfig;
_gjpConfig = new GjpClient();
}
/// <summary>
/// 发起请求
/// </summary>
/// <param name="uri"></param>
/// <param name="data"></param>
/// <returns></returns>
private string DoRequest(string uri, object data, HttpMethod method)
{
string strResult = string.Empty;
try
{
//拼接请求地址
string url = (_heihuConfig.ApiUrl.StartsWith("http") ? "" : "http://") + _heihuConfig.ApiUrl + uri;
//返回报文
string result = GetRequesResult(url, data, method);
strResult = result;
return strResult;
}
catch (Exception ex)
{
return ex.Message;
}
}
/// <summary>
/// 发起请求
/// </summary>
/// <param name="url"></param>
/// <param name="data"></param>
/// <returns></returns>
private string GetRequesResult(string url, object data, HttpMethod method)
{
//返回数据
string result = string.Empty;
//json字符串数据
string jsonData = string.Empty;
if (data != null)
{
jsonData = JsonConvert.SerializeObject(data, Formatting.Indented);
}
//请求头数据
Dictionary<string, string> dicHeader = new Dictionary<string, string>();
//token
string token = string.Empty;
TokenResult tokenResult = new TokenResult();
try
{
tokenResult = GetToken();
if (tokenResult.statusCode == "200")
{
token = tokenResult.data;
}
else
{
return "token获取失败:" + tokenResult.message;
}
}
catch (Exception ex)
{
return "token获取异常:" + ex.Message;
}
dicHeader.Add("X-AUTH", token);
if (method == HttpMethod.Get)
{
result = new WebUtils().DoGet(url, dicHeader);
}
else
{
result = new WebUtils().DoPost(url, jsonData, dicHeader);
}
return result;
}
/// <summary>
/// 获取Token
/// </summary>
/// <returns></returns>
private TokenResult GetToken()
{
TokenResult tokenResult = new TokenResult();
try
{
//存在token信息直接返回
string token = string.Empty;
//缓存中取
object obj = HttpRuntime.Cache.Get(tokenCacheKey);
if (obj != null && !string.IsNullOrEmpty(obj.ToString()))
{
tokenResult.statusCode = "200";
tokenResult.data = obj.ToString();
return tokenResult;
}
else
{
//添加日志
HeiHuLog log = new HeiHuLog();
log.RequestTime = DateTime.Now;
log.Operation = "获取Token";
//请求地址
string url = (_heihuConfig.ApiUrl.StartsWith("http") ? "" : "http://") + _heihuConfig.ApiUrl + "/api/user/v1/users/_login";
log.Url = url;
//添加请求头参数
Dictionary<string, string> headerParam = new Dictionary<string, string>();
headerParam.Add("x-client", xclient);
//请求数据
HashObject data = new HashObject();
if (_heihuConfig.Type == 0)
{
data["phone"] = _heihuConfig.Phone;
data["password"] = _heihuConfig.PassWord.SHA3_224();
}
else
{
data["code"] = _heihuConfig.Code;
data["username"] = _heihuConfig.Username;
data["type"] = _heihuConfig.Type;
data["password"] = _heihuConfig.PassWord.SHA3_224();
}
//请求报文
string requestData = JsonConvert.SerializeObject(data, Formatting.Indented);
log.RequestSrting = requestData;
//请求接口
string result = new WebUtils().DoPost(url, requestData, headerParam);
log.ResponseString = result;
//json转实体类
try
{
tokenResult = JsonConvert.DeserializeObject<TokenResult>(result);
}
catch (Exception)
{
tokenResult.statusCode = "-1";
tokenResult.message = result;
}
log.Code = tokenResult.statusCode;
log.Message = tokenResult.message;
if (tokenResult.statusCode == "200")
{
//获取到添加到缓存
token = tokenResult.data;
TimeSpan ts = new TimeSpan(0, 0, _time);
HttpRuntime.Cache.Insert(tokenCacheKey, token, null, DateTime.Now.AddMinutes(_minutes), ts);
//添加日志
log.Success = true;
}
else
{
//添加日志
log.Success = false;
tokenResult.message = string.Format("获取Token失败:{0},{1}", tokenResult.statusCode, tokenResult.message);
//抛出异常
//throw new Exception(string.Format("获取Token失败:{0},{1}", tokenResult.stat