(1) 通路Rest ful接口時 Token驗證 傳回資料格式封裝
(一)通路時Token驗證 傳回資料格式封裝
1.1通路Api接口 方法 實作
1.1.1 建立通路Restful Api幫助類
public static string MyGet = "GET";
public static string MyPost = "POST";
public static string MyPut = "PUT";
public static string MyDELETE = "DELETE";
/// <summary>
/// 通路接口資訊
/// </summary>
/// <param name="JsonString">抛送的字元串</param>
/// <param name="achieveUrl">通路的路徑</param>
/// <param name="PublishKey">密鑰Token</param>
/// <param name="Method">通路方法</param>
/// <returns></returns>
public static string SendService(string JsonString, string achieveUrl, string PublishKey, string Method)
{
//用于傳回資訊的記錄
var responseValue = string.Empty;
if (!string.IsNullOrEmpty(achieveUrl))
{
//基于http協定的請求響應
HttpWebRequest request = WebRequest.Create(achieveUrl) as HttpWebRequest;
//送出方法
request.Method = Method;
//設定Http标頭資訊
request.UserAgent = "";
//設定請求逾時時間
request.Timeout = 1000 * 60 * 30;
//設定讀取/寫入逾時時間
request.ReadWriteTimeout = 1000 * 60 * 30;
//request.Headers.Add("", "");
request.Headers.Add("Token", PublishKey);
request.ContentType = @"application/json";
//判斷通路方法
if (Method != "GET" && Method != "PUT")
{
request.ContentLength = Encoding.UTF8.GetByteCount(JsonString);
if (!string.IsNullOrEmpty(JsonString))//如果傳送的資料不為空,并且方法是put
{
var encoding = new UTF8Encoding();
var bytes = Encoding.GetEncoding("UTF-8").GetBytes(JsonString);//
request.ContentLength = bytes.Length;
using (var writeStream = request.GetRequestStream())
{
writeStream.Write(bytes, 0, bytes.Length);
}
}
}
//http請求的傳回狀态
using (var response = (HttpWebResponse)request.GetResponse())
//擷取來自 伺服器或接口的響應資訊
using (var responseStream = response.GetResponseStream())
if (responseStream != null)
using (var reader = new StreamReader(responseStream))
{
responseValue = reader.ReadToEnd();
}
}
return responseValue;
}
1.1.2 Token 加密方法
/// <summary>
/// Base64加密
/// <param name="codeName">加密采用的編碼方式</param>
/// <param name="source">待加密的明文</param>
public static string EncodeBase64(Encoding encode, string source)
string Result = "";
byte[] bytes = encode.GetBytes(source);
try
Result = Convert.ToBase64String(bytes);
catch
Result = source;
return Result;
/// Base64加密,采用utf8編碼方式加密
/// <returns>加密後的字元串</returns>
public static string EncodeBase64(string source)
return EncodeBase64(Encoding.UTF8, source);
1.1.3 擷取本地IP 進行加密 用作Token
public string GetAddressIP()
///擷取本地的IP位址
string AddressIP = string.Empty;
foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
AddressIP = _IPAddress.ToString();
return AddressIP;
1.1.4 讀取Json檔案 用作 通路接口抛送的内容
public static string GetFileJson(string filepath)
string json = string.Empty;
using (FileStream fs = new FileStream(filepath, FileMode.Open, System.IO.FileAccess.Read, FileShare.ReadWrite))
using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding("gb2312")))
json = sr.ReadToEnd().ToString();
return json;
1.1.5 Json檔案内容
{
"Name": "Szl",
"Age": "30",
"Address": "河南",
"XXXXXX": "測試資料"
}
1.1.6 調用接口
// GET: Home
public ActionResult Index()
string serviceURL = @"http://10.118.4.1x8:8082/szl/SzlAPI/Post";
string JsonString = GetFileJson(@"D:\VS2015Demo\RestServiceTest\UI\json.json");
string PublishKey = GetAddressIP();
ViewBag.Data = SendService(JsonString, serviceURL, EncodeBase64(PublishKey), "POST");
return View();
1.2 Rest Api 接口聲明
1.2.1接口方法
/// AspNet Core Post請求
/// <param name="value">User類</param>
/// <remarks>
///通路參數
/// POST
/// {
/// "value": "0e7ad584-7788-4ab1-95a6-ca0a5b444cbb",
/// }
///
/// </remarks>
/// <response code="201">傳回新建立項</response>
/// <response code="400">如果為空時</response>
[HttpPost]
[ProducesResponseType(typeof(User), 201)]
[ProducesResponseType(typeof(User), 400)]
public User Post([FromBody] User value)
//第二種接收值得方法
//Stream stream = HttpContext.Request.Body;
//byte[] buffer = new byte[HttpContext.Request.ContentLength.Value];
//stream.Read(buffer, 0, buffer.Length);
//string content = Encoding.UTF8.GetString(buffer);
////然後Json轉換
User Users = new User() { UserAddress = "北京", UserAge = "身體健康無頸椎病", UserName = "Szl", XXXXXX = "注意大小寫" };
return Users;
1.2.2 User類
public class User
{
/// 名稱
/// </remarks>
public string UserName { get; set; } = "名稱";
/// 年齡
public string UserAge { get; set; }
/// 位址
public string UserAddress { get; set; }
/// 測試字段
public string XXXXXX { get; set; }
1.3 添加 幫助類 WebApiAuthorizationFilter 對接口通路者身份Token 解密 擷取通路者IP 進行驗證,對傳回結果進行封裝
///
/// </summary>
public class WebApiAuthorizationFilter : IAuthorizationFilter
/// 調用者的身份驗證
/// <param name="context"></param>
public void OnAuthorization(AuthorizationFilterContext context)
//string IP = ((Microsoft.AspNetCore.Http.Internal.DefaultConnectionInfo)context.HttpContext.Connection).LocalIpAddress.ToString();
//擷取用戶端IP位址
string clientIP = ((Microsoft.AspNetCore.Http.Internal.DefaultConnectionInfo)context.HttpContext.Connection).RemoteIpAddress.ToString();
//擷取Token資訊
var Token = context.HttpContext.Request.Headers["Token"].FirstOrDefault();
//驗證Token
if (Token == "")
context.Result = new ObjectResult(new { Success = false, code = 404, msg = "請檢視令牌是否包含!", data = "null" });
else if (clientIP == DecodeBase64(Token))
return;
else
context.Result = new ObjectResult(new { Success = false, code = 404, msg = "請檢視令牌是否正确!", data = "null" });
/// Base64解密
/// <param name="codeName">解密采用的編碼方式,注意和加密時采用的方式一緻</param>
/// <param name="result">待解密的密文</param>
/// <returns>解密後的字元串</returns>
public static string DecodeBase64(Encoding codeName, string result)
string decode = "";
byte[] bytes = Convert.FromBase64String(result);
decode = codeName.GetString(bytes);
decode = result;
return decode;
/// Base64解密,采用utf8編碼方式解密
public static string DecodeBase64(string result)
return DecodeBase64(Encoding.UTF8, result);
1.4 在Startup.cs中注冊服務啟用 WebApiAuthorizationFilter檔案
services.AddMvc(options =>
//身份驗證不通過是傳回結果統一化
options.Filters.Add(typeof(WebApiAuthorizationFilter));
options.RespectBrowserAcceptHeader = true;
});
不加Token的結果

注意 傳回結果中的data的字段名 大小寫的變化 前邊的四位預設小寫了 這是架構本身Json序列化的結果
解決方法 在Startup.cs中注冊服務
services.AddMvc()
//預設傳回值 大小寫不變
.AddJsonOptions(op => op.SerializerSettings.ContractResolver =new Newtonsoft.Json.Serialization.DefaultContractResolver());
今天結束 本來下面的也要說說的太晚了留着明天吧
(2) 程式錯誤時 傳回資料格式封裝
(3) 傳回結果包裝
(4) 通路方法時 參數必填與非必填的聲明