ASPNET视频教程-Web API介绍
- 格式:ppt
- 大小:2.48 MB
- 文档页数:9
webapi方法注释Web API是一种用于构建和提供Web服务的技术,它允许应用程序通过HTTP协议进行通信和交互。
在本文中,将介绍几种常用的WebAPI方法,并讨论它们的特点和用法。
1. GET方法:GET方法用于从服务器获取资源。
它是最常用的API 调用方法之一。
通过GET方法,应用程序可以从服务器获取数据,并将其展示给用户。
GET方法的特点是安全、幂等和无副作用。
安全是指该方法不会对服务器上的资源进行修改;幂等是指多次调用该方法所产生的效果与一次调用的效果相同;无副作用是指该方法不会对服务器和数据库产生任何影响。
GET方法通常用于获取资源的信息,比如读取博客文章的内容或获取用户的个人资料。
2. POST方法:POST方法用于向服务器提交数据。
通过POST方法,应用程序可以向服务器发送数据,并请求服务器执行某种操作。
与GET方法不同,POST方法具有副作用,即会对服务器上的资源进行修改。
POST方法的特点是非幂等和有副作用。
非幂等是指多次调用该方法所产生的效果与一次调用的效果不同;有副作用是指该方法会对服务器和数据库产生影响。
POST方法通常用于创建新资源或修改现有资源,比如发布新的博客文章或更新用户的个人资料。
3. PUT方法:PUT方法用于更新服务器上的资源。
通过PUT方法,应用程序可以向服务器发送要更新的数据,并请求服务器更新指定的资源。
PUT方法与POST方法类似,都具有副作用,但PUT方法是幂等的,即多次调用该方法所产生的效果与一次调用的效果相同。
PUT方法通常用于更新资源的全部内容,比如修改博客文章的标题或更新用户的密码。
4. PATCH方法:PATCH方法用于部分更新服务器上的资源。
通过PATCH方法,应用程序可以向服务器发送要更新的数据,并请求服务器部分更新指定的资源。
与PUT方法不同,PATCH方法只更新资源的部分内容,而不是替换整个资源。
PATCH方法的使用场景是在不影响其他属性的情况下,更新资源的某些属性。
WebApi实现Token验证基于令牌的认证我们知道WEB⽹站的⾝份验证⼀般通过session或者cookie完成的,登录成功后客户端发送的任何请求都带上cookie,服务端根据客户端发送来的cookie来识别⽤户。
WEB API使⽤这样的⽅法不是很适合,于是就有了基于令牌的认证,使⽤令牌认证有⼏个好处:可扩展性、松散耦合、移动终端调⽤⽐较简单等等,别⼈都⽤上了,你还有理由不⽤吗?下⾯我们花个20分钟的时间来实现⼀个简单的WEB API token认证:Step 1:安装所需的NuGet包:打开NuGet包管理器控制台,然后输⼊如下指令:Install-Package Microsoft.AspNet.WebApi.Owin -Version 5.1.2Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0Install-Package Microsoft.AspNet.Identity.Owin -Version 2.0.1Install-Package Microsoft.Owin.Cors -Version 2.1.0Install-Package EntityFramework -Version 6.0.0Step 2 在项⽬根⽬录下添加Owin“Startup”类1using System;2using System.Web.Http;34using Owin;5using Microsoft.Owin;6using Microsoft.Owin.Security.OAuth;7using SqlSugar.WebApi;89 [assembly: OwinStartup(typeof(WebApi.Startup))]10namespace WebApi11 {12public class Startup13 {14public void Configuration(IAppBuilder app)15 {16 HttpConfiguration config = new HttpConfiguration();17 ConfigureOAuth(app);1819 WebApiConfig.Register(config);20 eCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);21 eWebApi(config);22 }2324public void ConfigureOAuth(IAppBuilder app)25 {26 OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()27 {28 AllowInsecureHttp = true,29 TokenEndpointPath = new PathString("/token"),30 AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),31 Provider = new SimpleAuthorizationServerProvider()32 };33 eOAuthAuthorizationServer(OAuthServerOptions);34 eOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());35 }36 }37 }View CodeStep 3:在项⽬根⽬录下添加验证类 SimpleAuthorizationServerProvider,为了简单⽤户的验证部分我们省略掉;1using System.Threading.Tasks;2using System.Security.Claims;3using Microsoft.Owin.Security.OAuth;45namespace WebApi6 {7///<summary>8/// Token验证9///</summary>10public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider11 {12public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)13 {14await Task.Factory.StartNew(() => context.Validated());15 }1617public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)18 {19await Task.Factory.StartNew(() => context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }));20/*21 * 对⽤户名、密码进⾏数据校验22 using (AuthRepository _repo = new AuthRepository())23 {24 IdentityUser user = await _repo.FindUser(erName, context.Password);2526 if (user == null)27 {28 context.SetError("invalid_grant", "The user name or password is incorrect.");29 return;30 }31 }*/3233var identity = new ClaimsIdentity(context.Options.AuthenticationType);34 identity.AddClaim(new Claim("sub", erName));35 identity.AddClaim(new Claim("role", "user"));3637 context.Validated(identity);3839 }40 }41 }View CodeStep 4:让CORS起作⽤在 Web API中启⽤OAuth的Access Token验证⾮常简单,只需在相应的Controller或Action加上[Authorize]标记1 [Authorize]2 [HttpGet, Route("product/getList")]3public List<Entity.Sys_User> GetProductList()4 {5throw new NotImplementedException();6 }View CodeStep 5 : 请求 Token获取token, POST http://localhost:23477/token参数BODY x-www-form-urlencoded 格式:grant_type=passwordusername=adminpassword=123456返回状态200 结果为Step 5 调⽤api只要在http请求头中加上Authorization:bearer Token就可以成功访问API就成功了:GET http://localhost:58192/api/testapi/testapiAuthorization : bearer T5jF97t5n-rBkWcwpiVDAlhzXtOvV7Jw2NnN1Aldc--xtDrvWtqLAN9hxJN3Fy7piIqNWeLMNm2IKVOqmmC0X5_s8MwQ6zufUDbvF4Bg5OHoHTKHX6NmZGNrU4mjpCuPLtSbT5bh_gFOZHoIXXIKmqD3Wu1MyyKKNhj9XPEIkd9bl4E9AZ1wAt4dyUxmPV结果为:。
一、介绍Web API随着互联网的发展,Web API(Application Programming Interface)变得越来越重要。
它为不同的软件应用程序之间提供了一种通信方式,使它们能够相互交换数据和功能。
在Web开发中,常常需要调用外部的Web API来获取数据或执行特定的功能。
二、HTML和Web API的结合HTML是一种标记语言,被广泛应用于网页设计和开发。
它通过使用标签来描述页面的结构和内容。
而Web API则提供了一种可以与网页进行交互的方式。
通过在HTML中调用Web API,我们可以实现很多功能,比如获取远程数据、执行特定的操作等。
三、调用Web API的HTML实例下面我们来看一个简单的例子,来演示如何在HTML中调用Web API。
```<!DOCTYPE html><html><head><title>调用Web API的HTML实例</title></head><body><h1>调用天气预报API</h1><button onclick="getWeather()">获取天气</button><p id="weather"></p><script>function getWeather() {fetch('网络协议sxxx // 假设这是一个天气预报的API.then(response => response.json()).then(data => {document.getElementById('weather').innerHTML = '今天的天气是:' + data.weather;});}</script></body></html>```在这个例子中,我们在HTML中通过一个按钮触发了调用天气预报的Web API的操作。
标题:.NET WebAPI项目实例代码一、背景介绍1.1 WebAPI的概念.NET WebAPI是一种基于框架的工具,用于构建HTTP服务,支持通过HTTP协议传输数据,可用于构建RESTful架构风格的服务。
二、建立WebAPI项目2.1 创建新的WebAPI项目在Visual Studio中,选择“新建项目”,然后选择“ Web应用程序”模板,命名为WebAPIExample。
2.2 配置路由打开WebApiConfig.cs文件,配置WebAPI的路由规则,可以通过MapHttpAttributeRoutes方法进行配置,也可以通过Route特性对控制器进行路由配置。
三、编写控制器3.1 创建控制器类在Controllers文件夹下新建一个名为ValuesController.cs的类,用于处理对资源的请求。
3.2 编写控制器方法编写Get、Post、Put和Delete等HTTP动词对应的方法,以处理客户端的请求,并返回相应的资源数据。
四、测试WebAPI4.1 使用Postman测试API在Postman中输入API的URL,并选择对应的HTTP动词,发送请求并查看返回的数据,验证API的功能是否正确。
4.2 测试WebAPI的异常处理可以模拟客户端发送错误的请求,例如无效的参数或无效的URL,验证WebAPI的异常处理机制是否能够正确捕获并处理异常。
五、部署WebAPI项目5.1 部署到IIS服务器将WebAPI项目部署到IIS服务器,配置应用程序池和站点,确保可以通过HTTP请求访问到WebAPI服务。
5.2 部署到Azure如果需要将WebAPI项目部署到Azure云评台,可以通过Visual Studio的发布功能,将WebAPI发布到Azure的App Service中,实现云端部署。
六、总结6.1 WebAPI的优势与应用场景总结WebAPI相对于传统的Web服务的优势,以及在实际项目中的应用场景。
文章标题:深度解析.net6 Web API 接口原理1. 介绍在今天的软件开发领域,Web API 接口的使用已经变得异常普遍。
.NET 6 是微软最新推出的版本,其对 Web API 接口的支持更加全面和强大。
我们有必要深入了解一下 .NET 6 Web API 接口的原理。
2. .NET 6 Web API 接口基本概念在深入了解 .NET 6 Web API 接口的原理之前,我们必须先了解一些基本概念。
这些概念包括 HTTP 协议、REST 架构、控制器、路由、模型绑定、中间件、过滤器、认证和授权等。
2.1 HTTP 协议HTTP 协议是 Web 通信的基础,它定义了客户端与服务器之间的通信规则。
在 .NET 6 中,Web API 接口是基于 HTTP 协议实现的。
2.2 REST 架构REST(Representational State Transfer)是一种设计风格,它强调客户端和服务器之间的状态转移。
在 .NET 6 中,Web API 接口通常遵循 RESTful 风格,以实现资源的增删改查操作。
2.3 控制器在 .NET 6 中,控制器是管理 Web API 请求和响应的核心组件。
通过控制器,我们可以定义路由、处理请求、进行模型绑定和返回响应。
2.4 路由路由是指定 URL 与控制器中的方法之间的映射关系。
在 .NET 6 中,我们可以使用路由来定义 Web API 接口的访问位置区域和参数。
2.5 模型绑定模型绑定是将 HTTP 请求的参数绑定到控制器的方法参数或自定义类型的过程。
在 .NET 6 中,模型绑定使得我们能够方便地处理请求参数并进行验证。
2.6 中间件中间件是 .NET 6 中用于处理 HTTP 请求和响应的组件。
通过中间件,我们可以实现请求的拦截、日志记录、异常处理等功能。
2.7 过滤器过滤器是在 .NET 6 中用于实现请求和响应过程中的预处理和后处理逻辑的组件。
webapi知识点总结一、什么是Web APIWeb API,全称Web Application Programming Interface,即Web应用程序编程接口。
它是一种通过HTTP协议提供的一组可供其他应用程序或系统调用的接口,用于实现不同系统之间的数据和功能交互。
Web API 是一种基于互联网的应用程序接口,具有开放性、易扩展性和跨平台的特点,可大大简化系统间的数据传输和功能调用,使得不同系统之间可以更加灵活地实现信息共享和功能集成。
二、Web API 的分类基于HTTP协议的Web API可以分为不同的类型,常见的包括:1. RESTful API:基于REST架构原则设计的API,使用HTTP动词对资源进行操作,如GET、POST、PUT、DELETE等,以URL作为资源标识,使用JSON或XML等数据格式进行通信。
2. SOAP API:基于XML的简单对象访问协议(Simple Object Access Protocol)设计的API,使用固定的XML消息格式进行通讯,常用于企业间系统集成。
根据不同的功能和用途,Web API还可以分为不同的类型,包括数据API、服务API、组件API等。
三、Web API 的设计原则1. RESTful 设计原则:基于资源、统一接口、状态无关、资源可标识、超媒体驱动等原则,遵循RESTful设计可以简化系统间的交互,并提高系统的可扩展性和灵活性。
2. 信息抽象原则:设计API时需要考虑用户需要的信息,对信息进行抽象和封装,提供适当的抽象层级,以便用户可以简单、灵活地使用API。
3. 规范化的接口:设计API时需要提供规范化的接口,包括清晰的URL路径、统一的数据格式、合理的状态码等,使得API易于使用和理解。
4. 数据安全和隐私原则:设计API时需要考虑数据的安全性和隐私性,采用合适的认证、授权和加密机制,以确保数据传输和存储的安全性。
5. 性能优化原则:设计API时需要考虑性能优化,包括减少网络传输量、合理使用缓存、优化数据库查询等方面,以提高API的响应速度和稳定性。
WebApi项⽬⽰例(增删改查)1.WebApi是什么 Web API 是⼀种框架,⽤于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务。
Web API 是⼀种⽤于在 .NET Framework 上构建 RESTful 应⽤程序的理想平台。
可以把WebApi看成项⽬类型中的⼀种,其他项⽬类型诸如我们熟知的WebForm项⽬,Windows窗体项⽬,控制台应⽤程序等。
WebApi类型项⽬的最⼤优势就是,开发者再也不⽤担⼼客户端和服务器之间传输的数据的序列化和反序列化问题,因为WebApi是强类型的,可以⾃动进⾏序列化和反序列化,⼀会⼉项⽬中会见到。
下⾯我们建⽴了⼀个WebApi类型的项⽬,项⽬中对产品Product进⾏增删改查,Product的数据存放在List<>列表(即内存)中。
2.页⾯运⾏效果如图所⽰,可以添加⼀条记录; 输⼊记录的Id,查询出该记录的其它信息;修改该Id的记录;删除该Id的记录。
3.⼆话不说,开始建项⽬1)新建⼀个“ MVC 4 Web 应⽤程序”项⽬,命名为“ProductStore”,点击确定,如图2)选择模板“Web API”,点击确定,如图3)和MVC类型的项⽬相似,构建程序的过程是先建⽴数据模型(Model)⽤于存取数据, 再建⽴控制器层(Controller)⽤于处理发来的Http请求,最后构造显⽰层(View)⽤于接收⽤户的输⼊和⽤户进⾏直接交互。
这⾥我们先在Models⽂件夹中建⽴产品Product类: Product.cs,如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace ProductStore.Models{public class Product{public int Id { get; set; }public string Name { get; set; }public string Category { get; set; }public decimal Price { get; set; }}}4)试想,我们⽬前只有⼀个Product类型的对象,我们要编写⼀个类对其实现增删改查,以后我们可能会增加其他的类型的对象,再需要编写⼀个对新类型的对象进⾏增删改查的类,为了便于拓展和调⽤,我们在Product之上构造⼀个接⼝,使这个接⼝约定增删改查的⽅法名称和参数,所以我们在Models⽂件夹中新建⼀个接⼝: IProductRepository.cs ,如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ProductStore.Models{interface IProductRepository{IEnumerable<Product> GetAll();Product Get(int id);Product Add(Product item);void Remove(int id);bool Update(Product item);}}5)然后,我们实现这个接⼝,在Models⽂件夹中新建⼀个类,具体针对Product类型的对象进⾏增删改查存取数据,并在该类的构造⽅法中,向List<Product>列表中存⼊⼏条数据,这个类叫:ProductRepository.cs,如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace ProductStore.Models{public class ProductRepository:IProductRepository{private List<Product> products = new List<Product>();private int _nextId = 1;public ProductRepository(){Add(new Product { Name="Tomato soup",Category="Groceries",Price=1.39M});Add(new Product { Name="Yo-yo",Category="Toys",Price=3.75M});Add(new Product { Name = "Hammer", Category = "Hardware", Price = 16.99M });}public IEnumerable<Product> GetAll(){return products;}public Product Get(int id){return products.Find(p=>p.Id==id);}public Product Add(Product item){if (item == null){throw new ArgumentNullException("item");}item.Id = _nextId++;products.Add(item);return item;}public void Remove(int id){products.RemoveAll(p=>p.Id==id);}public bool Update(Product item){if (item == null){throw new ArgumentNullException("item");}int index = products.FindIndex(p=>p.Id==item.Id);if (index == -1){return false;}products.RemoveAt(index);products.Add(item);return true;}}}此时,Model层就构建好了。
⼿把⼿教你AspNetCoreWebApi认证与授权的⽅法前⾔这⼏天⼩明⼜有烦恼了,之前给⼩红的接⼝没有做认证授权,直接裸奔在线上,被马⽼板发现后狠狠的骂了⼀顿,赶紧让⼩明把授权加上。
赶紧Baidu⼀下,发现⼤家都在⽤JWT认证授权,这个倒是挺适合⾃⼰的。
什么是TokenToken是服务端⽣成的⼀串字符串,以作客户端进⾏请求的⼀个令牌,当第⼀次登录后,服务器⽣成⼀个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,⽆需再次带上⽤户名和密码。
什么是JWTJson web token (JWT),是为了在⽹络应⽤环境间传递声明⽽执⾏的⼀种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适⽤于分布式站点的单点登录(SSO)场景。
JWT的声明⼀般被⽤来在⾝份提供者和服务提供者间传递被认证的⽤户⾝份信息,以便于从资源服务器获取资源,也可以增加⼀些额外的其它业务逻辑所必须的声明信息,该token也可直接被⽤于认证,也可被加密。
JWT认证流程从图中可以看出主要有两部分组成:1、获取Token,2、通过Token进⾏授权。
使⽤JWT认证⾸先,安装JwtBearer包。
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer --version 3.1.0接下来,定义⼀个配置类,我这⾥为了简单直接⽤常量代替了,你也可以放在配置⽂件中。
public class TokenParameter{public const string Issuer = "深度码农";//颁发者public const string Audience = "深度码农";//接收者public const string Secret = "1234567812345678";//签名秘钥public const int AccessExpiration = 30;//AccessToken过期时间(分钟)}接下来,定义⼀个通过⽤户名和密码,获取Token的控制器。
webapi 讲解Web API(Application Programming Interface)是一种用于不同应用程序之间进行通信的技术。
它允许开发人员通过定义的接口,以统一的方式访问和操作远程服务器上的资源。
本文将围绕Web API展开讨论,从其基本概念、工作原理、应用场景和未来发展等方面进行介绍。
一、Web API的基本概念Web API是一种软件接口,它使用HTTP协议作为通信协议,通过URL(Uniform Resource Locator)来定位和访问资源。
它可以提供各种服务,如数据查询、数据修改、文件上传和下载等。
Web API 基于REST(Representational State Transfer)架构风格,以资源为中心,使用HTTP方法(GET、POST、PUT、DELETE)来进行操作。
二、Web API的工作原理Web API的工作原理可以简单描述为以下几个步骤:1. 客户端通过HTTP请求访问Web API,包括指定资源的URL和请求方法。
2. 服务器接收到请求后,根据URL和请求方法,调用相应的API方法。
3. API方法对请求进行处理,可能涉及数据查询、数据更新等操作。
4. 处理完请求后,服务器将结果封装成HTTP响应返回给客户端。
三、Web API的应用场景Web API在互联网应用开发中有广泛的应用场景,例如:1. 移动应用开发:移动应用可以通过Web API访问远程服务器上的数据,实现数据的同步和共享。
2. 第三方集成:Web API可以提供给第三方开发者使用,使其能够与自己的应用进行集成,实现更多功能和服务。
3. 数据开放:Web API可以将内部数据开放给外部开发者使用,促进数据共享和创新。
4. 服务器通信:不同服务之间可以通过Web API进行通信,实现数据的交互和共享。
四、Web API的未来发展随着互联网的快速发展和应用需求的不断增加,Web API的重要性日益凸显。
以下是一个简单的 Web API中使用Session的示例:首先,在Web API项目中创建一个Controller,例如名为"SessionController"的控制器。
在SessionController中添加一个方法,例如名为"GetSessionData"的方法,用于获取Session数据。
在该方法中,我们首先检查Session是否包含键"MyKey",如果包含,则返回其值。
否则,我们将返回一个空字符串。
csharp复制代码public class SessionController : ApiController{public string GetSessionData(){if (HttpContext.Current.Session["MyKey"] != null){return HttpContext.Current.Session["MyKey"].ToString();}else{return"";}}}在Web API的启动文件(例如App_Start/WebApiConfig.cs)中,我们需要配置SessionState行为。
在这个例子中,我们将使用InProc模式,该模式将SessionState 存储在进程内存中。
如果您想将SessionState存储在SQL Server数据库中,则需要修改连接字符串并使用StateServer模式。
csharp复制代码public static void Register(HttpConfiguration config){// ...config.EnableSystemDiagnosticsTracing();config.InitializeServices(new SessionDependencyResolver());config.SuppressDefaultResponseHeaders = false;config.IncludeErrorDetailPolicy =IncludeErrorDetailPolicy.Always;eSqlServerStorage("DefaultConnection");config.SetMaxHttpCollectionKeysPerRequest(200);config.Services.Replace(typeof(IHttpModule), newSessionModule());config.Services.Add(typeof(IExceptionFilter), newGlobalExceptionFilter());// ...}我们还需要创建一个SessionDependencyResolver类来处理SessionState的依赖关系。
mvcwebapi实⽤的接⼝加密⽅法在很多项⽬中,因为webapi是对外开放的,这个时候,我们就要得考虑接⼝交换数据的安全性。
安全机制也⽐较多,如andriod与webapi 交换数据的时候,可以⾛双向证书⽅法,但是开发成本⽐较⼤,今天我们不打算介绍这⽅⾯的知识,我们说说⼀个较简单也较常见的安全交换机制在这⾥要提醒读者,⽬前所有的加密机制都不是绝对的安全!我们的⽬标是,任何⽤户或者软件获取到我们的webapi接⼝url后⽤来再次访问该地址都是⽆效的!达到这种⽬标的话,我们必须要在url中增加⼀个时间戳,但是仅仅如此还是不够,⽤户可以修改我们的时间戳!因此我们可以对时间戳进⾏MD5加密,但是这样依然不够,⽤户可以直接对我们的时间戳md5的哦,因些需要引⼊⼀个绝对安全的双⽅约定的key,并同时加⼊其它参数进⾏混淆!注意:这个key要在app⾥和我们的webapi⾥各保存相同的⼀份!于是我们约定公式:加密结果=md5(时间戳+随机数+key+post或者get的参数)下⾯我们开始通过上述公式写代码:于由我的环境是 mvc 的,所以重写⼀个加密类ApiSecurityFilter1、获取参数if (request.Headers.Contains("timestamp"))timestamp = HttpUtility.UrlDecode(request.Headers.GetValues("timestamp").FirstOrDefault());if (request.Headers.Contains("nonce"))nonce = HttpUtility.UrlDecode(request.Headers.GetValues("nonce").FirstOrDefault());if (request.Headers.Contains("signature"))signature = HttpUtility.UrlDecode(request.Headers.GetValues("signature").FirstOrDefault());if (string.IsNullOrEmpty(timestamp) || string.IsNullOrEmpty(nonce) || string.IsNullOrEmpty(signature))throw new SecurityException();2、判断时间戳是否超过指定时间double ts = 0;bool timespanvalidate = double.TryParse(timestamp, out ts);bool falg = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalMilliseconds - ts > 60 * 1000;if (falg || (!timespanvalidate))throw new SecurityException();3、POST/DELETE/UPDATE 三种⽅式提取参数case"POST":case"PUT":case"DELETE":Stream stream = HttpContext.Current.Request.InputStream;StreamReader streamReader = new StreamReader(stream);sortedParams = new SortedDictionary<string, string>(new JsonSerializer().Deserialize<Dictionary<string, string>>(new JsonTextReader(streamReader)));break;4、GET ⽅式提取参数case"GET":IDictionary<string, string> parameters = new Dictionary<string, string>();foreach (string key in HttpContext.Current.Request.QueryString){if (!string.IsNullOrEmpty(key)){parameters.Add(key, HttpContext.Current.Request.QueryString[key]);}}sortedParams = new SortedDictionary<string, string>(parameters);break;5、排序上述参数并拼接,形成我们要参与md5的约定公式中的第四个参数StringBuilder query = new StringBuilder();if (sortedParams != null){foreach (var sort in sortedParams.OrderBy(k => k.Key)){if (!string.IsNullOrEmpty(sort.Key)){query.Append(sort.Key).Append(sort.Value);}}data = query.ToString().Replace("", "");}6、开始约定公式计算结果并对⽐传过的结果是否⼀致var md5Staff = Seedwork.Utils.CharHelper.MD5(string.Concat(timestamp + nonce + staffId + data), 32);if (!md5Staff.Equals(signature))throw new SecurityException();完整的代码如下:1public class ApiSecurityFilter : ActionFilterAttribute2 {3public override void OnActionExecuting(HttpActionContext actionContext)4 {5var request = actionContext.Request;67var method = request.Method.Method;8var staffId = "^***********************************$";910string timestamp = string.Empty, nonce = string.Empty, signature = string.Empty;1112if (request.Headers.Contains("timestamp"))13 timestamp = request.Headers.GetValues("timestamp").FirstOrDefault();1415if (request.Headers.Contains("nonce"))16 nonce = request.Headers.GetValues("nonce").FirstOrDefault();1718if (request.Headers.Contains("signature"))19 signature = request.Headers.GetValues("signature").FirstOrDefault();2021if (string.IsNullOrEmpty(timestamp) || string.IsNullOrEmpty(nonce) || string.IsNullOrEmpty(signature))22throw new SecurityException();2324double ts = 0;25bool timespanvalidate = double.TryParse(timestamp, out ts);2627bool falg = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalMilliseconds - ts > 60 * 1000;2829if (falg || (!timespanvalidate))30throw new SecurityException("timeSpanValidate");3132var data = string.Empty;33 IDictionary<string, string> sortedParams = null;3435switch (method.ToUpper())36 {37case"POST":38case"PUT":39case"DELETE":4041 Stream stream = HttpContext.Current.Request.InputStream;42 StreamReader streamReader = new StreamReader(stream);43 sortedParams = new SortedDictionary<string, string>(new JsonSerializer().Deserialize<Dictionary<string, string>>(new JsonTextReader(streamReader))); 4445break;4647case"GET":4849 IDictionary<string, string> parameters = new Dictionary<string, string>();5051foreach (string key in HttpContext.Current.Request.QueryString)52 {53if (!string.IsNullOrEmpty(key))54 {55 parameters.Add(key, HttpContext.Current.Request.QueryString[key]);56 }57 }5859 sortedParams = new SortedDictionary<string, string>(parameters);6061break;6263default:64throw new SecurityException("defaultOptions");65 }6667 StringBuilder query = new StringBuilder();6869if (sortedParams != null)70 {71foreach (var sort in sortedParams.OrderBy(k => k.Key))72 {73if (!string.IsNullOrEmpty(sort.Key))74 {75 query.Append(sort.Key).Append(sort.Value);76 }77 }7879 data = query.ToString().Replace("", "");80 }8182var md5Staff = Seedwork.Utils.CharHelper.MD5(string.Concat(timestamp + nonce + staffId + data), 32);8384if (!md5Staff.Equals(signature))85throw new SecurityException("md5Staff");8687base.OnActionExecuting(actionContext);88 }8990public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 91 {92base.OnActionExecuted(actionExecutedContext);93 }94 }7、最后在 mvc ⾥加⼊配置上述类public static class WebApiConfig{public static void Register(HttpConfiguration config){// Web API configuration and servicesconfig.Filters.Add(new ApiSecurityFilter());config.Filters.Add(new ApiHandleErrorAttribute());// Web API routesconfig.MapHttpAttributeRoutes();config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });}}public class ApiHandleErrorAttribute: ExceptionFilterAttribute{///<summary>/// add by laiyunba///</summary>///<param name="filterContext">context oop</param>public override void OnException(HttpActionExecutedContext filterContext){LoggerFactory.CreateLog().LogError(Messages.error_unmanagederror, filterContext.Exception); }}9、利⽤微信⼩程序测试接⼝var data = {UserName: username,Password: password,Action: 'Mobile',Sms: ''};var timestamp = util.gettimestamp();var nonce = util.getnonce();if (username && password) {wx.request({url: rootUrl + '/api/login',method: "POST",data: data,header: {'content-type': 'application/json','timestamp': timestamp,'nonce': nonce,'signature': util.getMD5Staff(data, timestamp, nonce)},success: function (res) {if (res.data) {1)其中getMD5Staff函数:function getMD5Staff(queryData, timestamp, nonce) {var staffId = getstaffId();//保存的key与webapi同步var data = dictionaryOrderWithData(queryData);return md5.md5(timestamp + nonce + staffId + data);}2)dictionaryOrderWithData函数:function dictionaryOrderWithData(dic) {//eg {x:2,y:3,z:1}var result = "";var sdic = Object.keys(dic).sort(function (a, b) { return a.localeCompare(b) });var value = "";for (var ki in sdic) {if (dic[sdic[ki]] == null) {value = ""}else {value = dic[sdic[ki]];}result += sdic[ki] + value;}return result.replace(/\s/g, "");}10、测试⽇志LaiyunbaApp Error: 2 : 2017-10-18 09:15:25 Unmanaged error in aplication, the exception information is Exception:System.Security.SecurityException: 安全性错误。
webapi接口开发实例本文旨在为读者讲解WebAPI口开发的实例,帮助读者掌握开发WebAPI口的步骤。
WebAPI口可以有效的提高系统的可用性和可维护性,是将单体应用架构慢慢演变为微服务架构的重要组成部分,因此开发 WebAPI口也变得日益重要。
一、WebAPI口定义WebAPI口是一种为客户端和服务端之间提供交互通信的接口,客户端和服务端之间通过该接口实现数据交互,服务端提供数据服务,而客户端通过调用接口消费服务。
WebAPI口通常采用 REST格开发,支持 HTTP议,具有轻量级的体积,易用性强的特点。
二、WebAPI口开发步骤1.析业务需求首先要根据应用的业务需求,分析具体实现 WebAPI口所需的功能,规划好 WebAPI口的架构,明确接口的传入参数和输出结果。
2.码实现根据需求分析的结果,开发者可以基于 Core架,使用Visual Studio发工具来实现 WebAPI口。
编写 WebAPI口时,一般可以使用 .NET架自带的类库、API,也可以引入第三方类库等来实现接口的功能。
3.试与部署编写完 WebAPI口代码后,需要进行测试,检验接口的功能和使用是否正常,然后将接口部署到服务器上。
4.护与性能优化WebAPI口部署完成后,需要对应用进行维护,定期检查和更新接口,查找和修复潜在的 bug。
此外,如果应用的性能和响应时间非常重要,也可以根据应用业务需求,利用相关技术进行性能优化。
三、总结WebAPI口是目前系统开发中使用非常广泛的一种接口。
作为客户端和服务端之间的通信接口,WebAPI口的开发一般包括三个步骤:分析业务需求、编写实现、测试与部署,完成之后,还要对 WebAPI 口进行维护与性能优化。
⼿把⼿教你AspNetCoreWebApi:缓存(MemoryCache和Redis)前⾔这⼏天⼩明⼜有烦恼了,系统上线⼀段时间后,系统性能出现了问题,马⽼板很⽣⽓,叫⼩明⼀定要解决这个问题。
性能问题⼀般⽤什么来解决呢?⼩明第⼀时间想到了缓存。
什么是缓存缓存是实际⼯作中⾮常常⽤的⼀种提⾼性能的⽅法。
缓存可以减少⽣成内容所需的⼯作,从⽽显著提⾼应⽤程序的性能和可伸缩性。
缓存最适⽤于不经常更改的数据。
通过缓存,可以⽐从原始数据源返回的数据的副本速度快得多。
使⽤内存缓存(MemoryCache)⾸先,我们简单的创建⼀个控制器,实现⼀个简单⽅法,返回当前时间。
我们可以看到每次访问这个接⼝,都可以看到当前时间。
[Route("api/[controller]")][ApiController]public class CacheController : ControllerBase{[HttpGet]public string Get(){return DateTime.Now.ToString();}}接下来,安装Microsoft.Extensions.Caching.Memory包 - 右键单击“解决⽅案资源管理器” > “管理 NuGet 包”中的项⽬ - 将“包源”设置为“” - 确保启⽤“包括预发⾏版”选项 - 在搜索框中输⼊“Microsoft.Extensions.Caching.Memory” - 从“浏览”选项卡中选择最新的“Microsoft.Extensions.Caching.Memory”包,然后单击“安装”接下来,使⽤依赖关系注⼊从应⽤中引⽤的服务,在Startup类的ConfigureServices()⽅法中配置:public void ConfigureServices(IServiceCollection services){services.AddMemoryCache();}接下来,在构造函数中请求IMemoryCache实例private IMemoryCache cache;public CacheController(IMemoryCache cache){this.cache = cache ?? throw new ArgumentNullException(nameof(cache));}接下来,在Get⽅法中使⽤缓存[HttpGet]public string Get(){//读取缓存var now = cache.Get<string>("cacheNow");if (now == null) //如果没有该缓存{now = DateTime.Now.ToString();cache.Set("cacheNow", now);return now;}else{return now;}}经过测试可以看到,缓存后,我们取到⽇期就从内存中获得,⽽不需要每次都去计算,说明缓存起作⽤了。
.NetWebApi基本操作⼀、服务端1.新建webapi项⽬2.配置WebApiConfigpublic const string DEFAULT_ROUTE_NAME = "DB";// DB指数据库上下⽂public static void Register(HttpConfiguration config){config.Routes.MapHttpRoute(name: "DEFAULT_ROUTE_NAME",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });config.EnableSystemDiagnosticsTracing();}3.在models⽂件新建studentInfo模型[Table("studentInfo")]public class studentInfo{[Key]public int Id { get; set; }/// <summary>/// 学号/// </summary>public int studentId { get; set; }/// <summary>/// 学⽣姓名/// </summary>public string studentName { get; set; }/// <summary>/// 联系⽅式/// </summary>public string contact { get; set; }}4.在models⽂件中添加DB,数据库上下⽂, DB要继承DbContextpublic DbSet<studentInfo> sInfo { get; set; }5.在models⽂件中添加接⼝IstudentRepository/// <summary>/// 获得所有⼈/// </summary>/// <returns></returns>IEnumerable<studentInfo> GetAll();/// <summary>/// 根据ID查询/// </summary>/// <param name="id"></param>/// <returns></returns>studentInfo Get(int id);/// <summary>/// 添加/// </summary>/// <param name="person"></param>/// <returns></returns>studentInfo Add(studentInfo info);/// <param name="id"></param>void Remove(int id);/// <summary>/// 更新/// </summary>/// <param name="person"></param>/// <returns></returns>bool Update(studentInfo info);6.在models⽂件中添加仓库实现studentRepositorypublic class studentRepository : IstudentRepository{DB db = new DB();private List<studentInfo> _people = new List<studentInfo>();public IEnumerable<studentInfo> GetAll(){var model = db.sInfo.OrderByDescending(c => c.Id).ToList();return model;}public studentInfo Get(int id){var queryData = db.sInfo.FirstOrDefault(c => c.Id == id);return queryData;}public studentInfo Add(studentInfo info){if (info == null){throw new ArgumentNullException("info");}var addmodel = db.sInfo.Add(info);db.SaveChanges();return addmodel;}public void Remove(int id){var model = db.sInfo.Find(id);db.sInfo.Remove(model);public bool Update(studentInfo Info){if (Info == null){return false;}else{var model = db.sInfo.FirstOrDefault(c => c.Id == Info.Id);model.studentId = Info.studentId;model.studentName = Info.studentName;model.contact = Info.contact;var entry = db.Entry(model);entry.Property(c => c.studentId).IsModified = true;entry.Property(c => c.contact).IsModified = true;entry.Property(c => c.studentName).IsModified = true;db.SaveChanges();return true;}}}7.配置web.config<add name="DB" providerName="System.Data.SqlClient" connectionString="Data Source=.;Initial Catalog=WebApiDB;Integrated Security=SSPI; User ID=sa; password=123456" />8.在controllers中添加apiController为PersonControllerstatic readonly IstudentRepository databasePlaceholder = new studentRepository();/// <summary>/// 所有⼈数/// </summary>/// <returns></returns>public IEnumerable<studentInfo> GetAllPeople(){return databasePlaceholder.GetAll();}/// <summary>/// 查询/// </summary>/// <param name="id"></param>/// <returns></returns>public studentInfo GetPersonByID(int id){studentInfo person = databasePlaceholder.Get(id);if (person == null){throw new HttpResponseException(HttpStatusCode.NotFound);/// <summary>/// 添加/// </summary>/// <param name="person"></param>/// <returns></returns>public HttpResponseMessage PostPerson(studentInfo person){person = databasePlaceholder.Add(person);string apiName = MyWebApiDemo.WebApiConfig.DEFAULT_ROUTE_NAME;var response = this.Request.CreateResponse<studentInfo>(HttpStatusCode.Created, person);string uri = Url.Link(apiName, new { id = person.Id });response.Headers.Location = new Uri(uri);return response;}/// <summary>/// 更新/// </summary>/// <param name="person"></param>/// <returns></returns>public bool PutPerson(studentInfo person){if (!databasePlaceholder.Update(person)){throw new HttpResponseException(HttpStatusCode.NotFound);}return true;}/// <summary>/// 删除/// </summary>/// <param name="id"></param>public void DeletePerson(int id){studentInfo person = databasePlaceholder.Get(id);if (person == null){throw new HttpResponseException(HttpStatusCode.NotFound);}databasePlaceholder.Remove(id);}⼆、客户端private const string url = "http://localhost:50043/";public ActionResult Index(){List<studentInfo> people = GetAllPerson();return View(people);}/// <summary>/// 获得所有学⽣信息/// </summary>/// <returns></returns>static List<studentInfo> GetAllPerson(){HttpClient client = new HttpClient();HttpResponseMessage response = client.GetAsync(url + "api/person").Result;return response.Content.ReadAsAsync<List<studentInfo>>().Result;}public ActionResult Delete(int id)return RedirectToAction("Index");}/// <summary>/// 删除/// </summary>/// <param name="id"></param>static void DeletePerson(int id){HttpClient client = new HttpClient();client.BaseAddress = new Uri(url);var relativeUri = "api/person/" + id.ToString();var response = client.DeleteAsync(relativeUri).Result;client.Dispose();}static studentInfo GetPerson(int id){HttpClient client = new HttpClient();HttpResponseMessage response = client.GetAsync(url + "api/person/" + id).Result; return response.Content.ReadAsAsync<studentInfo>().Result;}public ActionResult Update(int id){studentInfo model = GetPerson(id);return View(model);}[HttpPost]public ActionResult Update(studentInfo info){UpdatePerson(info);return RedirectToAction("Index");}static bool UpdatePerson(studentInfo info){HttpClient client = new HttpClient();client.BaseAddress = new Uri(url);var response = client.PutAsJsonAsync("api/person", info).Result;bool b= response.Content.ReadAsAsync<bool>().Result;return b;}public ActionResult Create(){return View();}[HttpPost]public ActionResult Create(studentInfo info){JObject newPerson = AddPerson(info);return RedirectToAction("Index");}static JObject AddPerson(studentInfo info){HttpClient client = new HttpClient();client.BaseAddress = new Uri(url);var response = client.PostAsJsonAsync("api/person", info).Result;return response.Content.ReadAsAsync<JObject>().Result;。
webapi 概念Web API 是一种用于在互联网上创建和传输数据的标准方式。
它基于HTTP (Hypertext Transfer Protocol)协议,使用JSON(JavaScript Object Notation)或XML(eXtensible Markup Language)格式来传输数据。
Web API 是一种服务器端应用程序,它允许客户端应用程序通过HTTP 请求来访问服务器上的数据。
Web API 可以提供各种功能,例如数据存储、身份验证、文件上传和下载等。
Web API 的工作原理是,客户端向服务器发送HTTP 请求,服务器接收到请求后,处理请求并返回相应的数据。
数据可以是JSON 或XML 格式,具体取决于客户端和服务器之间的约定。
Web API 的开发通常使用RESTful(Representational State Transfer)架构风格。
RESTful 架构风格基于HTTP 协议,将Web API 视为一组可访问的资源,每个资源都有一个唯一的URL(Uniform Resource Locator)。
客户端可以通过发送HTTP 请求来访问这些资源,并获取或修改数据。
Web API 的开发还涉及到一些重要的概念,例如:1. API 版本控制:为了确保不同版本的API 之间的兼容性,可以使用URL 中的版本号来区分不同版本的API。
2. 数据传输格式:Web API 可以使用JSON 或XML 格式来传输数据。
JSON 格式通常更简洁、易读,而XML 格式则更适用于结构化数据。
3. 错误处理:Web API 需要正确处理错误情况,例如请求参数无效或服务器出现故障等。
通常可以使用HTTP 状态码来标识不同的错误情况。
4. 安全性:Web API 需要考虑安全性问题,例如防止未经授权的访问、数据加密和身份验证等。
可以使用OAuth、API Key 等机制来保护Web API 的安全性。
web api中的getusermedia()方法【最新版3篇】目录(篇1)1.Web API 简介2.getUserMedia() 方法的作用3.getUserMedia() 方法的使用4.浏览器支持情况5.示例代码正文(篇1)1.Web API 简介Web API 是一组用于在 Web 浏览器中访问设备的 JavaScript API。
它可以让开发者访问用户的摄像头、麦克风和其他传感器,以便实现实时通信、在线会议和其他相关功能。
Web API 遵循 W3C 的标准,因此可以在各种现代浏览器中运行。
2.getUserMedia() 方法的作用getUserMedia() 方法是 Web API 中的一个重要方法,它允许开发者访问用户的媒体设备,例如摄像头和麦克风。
这个方法返回一个MediaDevices 对象,该对象包含了可用的媒体设备的信息。
3.getUserMedia() 方法的使用要使用 getUserMedia() 方法,首先需要 navigator.mediaDevices 属性的访问权限。
然后,调用 getUserMedia() 方法并传入一个可选的参数,该参数是一个字符串,表示要访问的媒体类型。
例如,可以传入"video"或"audio"来分别访问摄像头和麦克风。
4.浏览器支持情况getUserMedia() 方法在现代浏览器中得到了广泛的支持。
不过,由于浏览器实现的差异,可能需要处理一些兼容性问题。
在使用getUserMedia() 方法之前,建议使用navigator.mediaDevices.getUserMedia() 来检查该方法是否可用。
5.示例代码下面是一个简单的示例,展示了如何使用 getUserMedia() 方法访问摄像头和麦克风:```javascriptavigator.mediaDevices.getUserMedia({video: true, audio: true}).then(function(mediaDevices) {// 获取摄像头和麦克风的媒体设备对象const videoDevice = mediaDevices.getDisplayMedia({video: true});const audioDevice = mediaDevices.getDisplayMedia({audio: true});// 创建一个 HTMLVideoElement 和 HTMLAudioElementconst videoElement = document.createElement("video");const audioElement = document.createElement("audio");// 将摄像头和麦克风的数据源添加到 HTML 元素中videoElement.srcObject = videoDevice;audioElement.srcObject = audioDevice;// 将 HTML 元素添加到页面中document.body.appendChild(videoElement);document.body.appendChild(audioElement);}).catch(function(error) {console.error("访问媒体设备时出错:", error);});```总之,getUserMedia() 方法在 Web API 中扮演着重要角色,它允许开发者访问用户的媒体设备,实现实时通信和其他相关功能。
webapi参数Web API参数通常用于传递信息、请求数据或配置API的行为。
这些参数可以通过URL、请求头、请求体或查询字符串等方式传递给API。
下面是一些常见的Web API参数类型:1.查询参数(Query Parameters):位置:在URL的问号后面(?key1=value1&key2=value2)。
示例:网站用途:用于过滤、分页、排序等操作,通常在GET请求中使用。
2.路径参数(Path Parameters):位置:在URL的一部分。
示例:网站users/{userID}用途:用于标识资源的唯一标识符,通常用于RESTful API中。
3.请求体(Request Body):位置:在HTTP请求中,通常用于POST、PUT请求中。
示例:JSON格式的数据{"name":"John","age":30}用途:用于传递需要更新或创建的数据,通常以JSON格式发送。
4.请求头(Request Headers):位置:在HTTP请求头部分。
示例:Authorization:Bearer token123用途:用于传递授权、内容类型、编码等元数据信息。
5.表单数据(Form Data):位置:通常在POST请求中的表单中。
示例:name=John&email=john@example用途:用于提交表单数据,常见于传统的表单提交。
6.文件上传(File Upload):位置:通过multipart/form-data方式提交文件。
示例:上传图片、文档等文件。
用途:用于将文件传输到服务器端。
这些参数类型可以根据不同的API设计和需求进行组合和使用,以便于实现不同的功能和交互。
在设计和使用API时,合理选择和使用这些参数类型非常重要,以便于清晰地传递和处理数据。
webapiRoute属性定义 Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程。
在" Web API实践系列03,路由模版, 路由惯例, 路由设置"⼀⽂中,体验了通过模版、惯例、HTTP⽅法来设置路由,这种做法的好处是把路由模版统⼀放REST把⼀切都看成资源,有时候,⼀个资源连带⼦资源,⽐如Customer和Orders密切关联,我们可能希望输⼊这样的请求:customers/1/orders,但仅仅凭借惯例,很难实现这种路由。
⽽实际上, Web API为我们准备了Route特性,该特下⾯就在 MVC4下来体验Route特性的使⽤⽅法。
允许Route特性⾸先需要在WebApiConfig中设置。
using System.Web.Http;namespace MyRoutingAttributes4{public static class WebApiConfig{public static void Register(HttpConfiguration config){//设置特性路由config.MapHttpAttributeRoutes();config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });// 取消注释下⾯的代码⾏可对具有 IQueryable 或 IQueryable<T> 返回类型的操作启⽤查询⽀持。
// 若要避免处理意外查询或恶意查询,请使⽤ QueryableAttribute 上的验证设置来验证传⼊查询。
// 有关详细信息,请访问 /fwlink/?LinkId=279712。