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 = * * ;
//设置读取/写入超时时间
request.ReadWriteTimeout = * * ;
//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, , 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加密
/// </summary>
/// <param name="codeName">加密采用的编码方式</param>
/// <param name="source">待加密的明文</param>
/// <returns></returns>
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;
} /// <summary>
/// Base64加密,采用utf8编码方式加密
/// </summary>
/// <param name="source">待加密的明文</param>
/// <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": "",
"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接口方法
/// <summary>
/// AspNet Core Post请求
/// </summary>
/// <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), )]
[ProducesResponseType(typeof(User), )]
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>
/// 名称
/// </remarks> public string UserName { get; set; } = "名称";
/// <summary>
/// 年龄
/// </summary>
public string UserAge { get; set; }
/// <summary>
/// 地址
/// </summary> public string UserAddress { get; set; } /// <summary>
/// 测试字段
/// </summary>
public string XXXXXX { get; set; } }
1.3 添加 帮助类 WebApiAuthorizationFilter 对接口访问者身份Token 解密 获取访问者IP 进行验证,对返回结果进行封装
/// <summary>
///
/// </summary>
public class WebApiAuthorizationFilter : IAuthorizationFilter
{
/// <summary>
/// 调用者的身份验证
/// </summary>
/// <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 = , msg = "请查看令牌是否包含!", data = "null" });
}
else if (clientIP == DecodeBase64(Token))
{
return;
}
else
{
context.Result = new ObjectResult(new { Success = false, code = , msg = "请查看令牌是否正确!", data = "null" });
}
} /// <summary>
/// Base64解密
/// </summary>
/// <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);
try
{
decode = codeName.GetString(bytes);
}
catch
{
decode = result;
}
return decode;
} /// <summary>
/// Base64解密,采用utf8编码方式解密
/// </summary>
/// <param name="result">待解密的密文</param>
/// <returns>解密后的字符串</returns>
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) 访问方法时 参数必填与非必填的声明
代码中有不对的或者有更好的方法希望大家告之 相互学习 谢谢,转载注明出处
AspNet Core Api Restful +Swagger 实现微服务之旅 (三)的更多相关文章
- AspNet Core Api Restful +Swagger 实现微服务之旅(四)
这几天没更新,项目框架也是在发展阶段,这几天学习配置了一遍Apollo和RabbitMQ 等到放到框架上之后我整理一下到时候把心得写出来相互学习. 接着上一篇的内容 (2) 程序错误时 返回数据格 ...
- AspNet Core Api Restful +Swagger 发布IIS 实现微服务之旅 (二)
上一步我们创建好CoreApi 接下来在框架中加入 Swagger 并发布 到 IIS (1)首先点击依赖项>管理Nuget包 (2)输入 Swashbuckle.aspnetCore 比 ...
- AspNet Core Api Restful +Swagger 发布IIS
上一步我们创建好CoreApi 接下来在框架中加入 Swagger 并发布 到 IIS (1)首先点击依赖项>管理Nuget包 (2)输入 Swashbuckle.aspnetCore 比 ...
- AspNet Core Api Restful 实现微服务之旅 (一)
(一)了解微服务(二)搭建VS项目框架 (三)创建AspNet Core Api VS2017 安装包 链接:https://pan.baidu.com/s/1hsjGuJq 密码:ug59 创 ...
- 认证鉴权与API权限控制在微服务架构中的设计与实现(四)
引言: 本文系<认证鉴权与API权限控制在微服务架构中的设计与实现>系列的完结篇,前面三篇已经将认证鉴权与API权限控制的流程和主要细节讲解完.本文比较长,对这个系列进行收尾,主要内容包括 ...
- 微服务(入门三):netcore ocelot api网关结合consul服务发现
简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...
- 在 Docker 上运行一个 RESTful 风格的微服务
tags: Microservice Restful Docker Author: Andy Ai Weibo:NinetyH GitHub: https://github.com/aiyanbo/d ...
- 微服务介绍及Asp.net Core实战项目系列之微服务介绍
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.微服务选型 在做微服务架构的技术选型的时候,我们以“无侵入”和“社区活跃”为主要的考量点,将来升级为原子服务架构.量子服务架构 ...
- .net core中使用Bumblebee架设微服务网关
Bumblebee是款基于.net core开发开源的http服务网关,经过最近版本的完善在功能足以满足作为微服务网关的需要.在微服务网关功能中它提供了应用服务负载,故障迁移,安全控制,监控跟踪和日志 ...
随机推荐
- 一次线上Mysql数据库崩溃事故的记录
文章简介 工作这几年,技术栈在不断更新,项目管理心得也增加了不少,写代码的速度也在提升,感觉很欣慰,毕竟是在一直进步,但是过程中也有许许多多的曲折,也踩过了数不尽的坑坑洼洼,从一个连百度都不知道用的萌 ...
- JavaScript中把Json字符串转化为对象
1.采用eval()函数 定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需.要计算的字符串, ...
- 使用weinre远程调试
1.调试环境: 1)使用nodejs搭建调试服务器: 先安装node,然后使用npm安装weinre,在node.js安装目录输入以下命令 npm install weinre 2)需要wifi环境和 ...
- n! 进制
n! 进制 Time limit per test: 1.0 seconds Time limit all tests: 1.0 seconds Memory limit: 256 megabytes ...
- Ubuntu16 远程连接MySQL
1.进入MySQL配置目录允许其他IP可以链接 vi /etc/mysql/mysql.conf.d/mysqld.cnf 吧下面这行注释掉 #bind-address = 127.0.0.1 2.远 ...
- ThreadLocal 原理解析
1.对Thread local 理解 ThreadLocal 是为了解决线程间同步而创建的一个新的思路.简单来说就是每个线程都保存一个变量副本. 如果在Thread 内部定义一个field变量,也可以 ...
- elasticsearch地理空间操作简单操作
创建索引库 PUT http://localhost:9200/geo { "mappings": { "poi": { "properties&qu ...
- 巧用ecshop做淘宝客
一.第一步 下载文件,可以在http://www.ecshop.com/下载ecshop各个版本的安装包,安装好ECSHOP,然后通过PTF工具下载2个文件到本地进行修改.这个2个文件分别是goods ...
- C语言系列之强制类型转换(一)
例子: #include <stdio.h> { char cChar; //字符型变量 short int iShort; //短整型变量 int ilnt; / ...
- 用CRT查找内存泄漏
引用原文地址 : https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx 1. 在program中严格按下面顺序include #define _ ...