天天看點

AspNet Core Api Restful +Swagger 實作微服務之旅 (三)

    (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的結果

AspNet Core Api Restful +Swagger 實作微服務之旅 (三)
通路正确結果
AspNet Core Api Restful +Swagger 實作微服務之旅 (三)

注意 傳回結果中的data的字段名 大小寫的變化  前邊的四位預設小寫了 這是架構本身Json序列化的結果

解決方法  在Startup.cs中注冊服務

services.AddMvc()
            //預設傳回值 大小寫不變
           .AddJsonOptions(op => op.SerializerSettings.ContractResolver =new Newtonsoft.Json.Serialization.DefaultContractResolver());      

 今天結束 本來下面的也要說說的太晚了留着明天吧

      (2)  程式錯誤時  傳回資料格式封裝

      (3)  傳回結果包裝

      (4)  通路方法時 參數必填與非必填的聲明

Qt

繼續閱讀