webapi(一)
RESTful架构风格
这个架构风格其实就是接口的设计风格,就是一个规范。
(1)之前不管是webservice还是wcf都是调用的具体的方法,在restful架构风格中就不是调用具体的方法了。而是资源化,把调用的东西看成一个资源,而且这个资源对外只提供CRUD(增删改查) ,分别对应于http方法,比如Create对应于Post Read对应于Get Update对应于Put/Patch Delete对应于Delete , 这样统一了数据操纵的接口,仅仅通过http方法就能完成所有的增删改查工作。
(2)严格遵循http协,因为http是无状态的, 所以不会因为调用其它资源失败影响这个资源的调用
(3) 因为URI(统一资源标识符)能够唯一的标识资源,可以通过URI来访问资源。 只要能唯一标识资源的就是URI,在URI的基础上给出其资源的访问方式的就是URL,URL是URI的一个子集。它是Uniform Resource Locator的缩写,译为“统一资源定位 符”。,URI和URL都定义了资源是什么,但URL还定义了该如何访问资源。URL是一种具体的URI,它是URI的一个子集,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI 是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。
URI和URL的区别比较与理解
url调用的时候默认的是Get的形式,
WebApi路由
WebAPI 是开发接口的技术
特性路由
创建webapi的时候一般都是有默认路由,如果不想用这个默认路由的调用方式的话,可以使用特性路由给具体的方法定制一个调用形式,它的优先级是高于默认路由的
[RoutePrefix("api/Values")] public class ValuesController : ApiController { // GET api/values //1.匹配请求的Method //2.匹配HttpGet //3.匹配参数 //特性路由:优先级最高,绕开默认的Api路由; //特性路由:随意的指定我们请求Api的URL [HttpGet] //[Route("api/Values/Get")] [Route("Get")] public IEnumerable<string> LGetadfsgfsf() { return new string[] { "value1", "value2" }; } //public IEnumerable<string> GetUser() //{ // return new string[] { "value1", "value2" }; //} // GET api/values/5 //[Route("api/Values/Get/{id:int}")] [Route("Get/{id:int}")] public string Get(int id) { return "value-Get"; } [Route("Get/{id}")] public string GetStr(string id) { return "value-Get"; } //[Route("api/Values/Get/{id:int}/V2/Richard")] [Route("Get/{id:int}/V2/Richard")] public string GetV2(int id) { return "value-GetV2"; } // POST api/values public void Post([FromBody]string value) { } // PUT api/values/5 public void Put(int id, [FromBody]string value) { } // DELETE api/values/5 public void Delete(int id) { } }
WebApi的权限认证
传统方式:基于Session Cookies ,在Webapi 是不支持的,但是可以自行扩展来支持;
(1)Basic基础认证
因为WebApi是基于http协议的,http协议又是无状态的,所以通过获取令牌,或者说token来认证,来确定登录的人是谁的。请求服务器webapi的时候带上token,然后对token进行验证,看看这个token是否存在。令牌这个
一个MVC项目端口是1,一个webapi项目的端口是2,但是mvc项目中使用ajax调用了webapi的项目,这时候就产生了跨域,要是在mvc项目中以webapi的接口形式调用也不会产生跨域。
同源策略:出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容。
as
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术