• RESTFul API


    一、前言

    RESTful API 是基于HTTP协议产生的一种相对简单的API设计方案;

    RESTful 的核心是 everything is a “resource”,所有的HTTP action,都应该是相应resource上可以被操作和处理的,而API 就是对资源的管理操作,而这个具体操作是由 HTTP action 指定的。

    使用HTTP的GET、POST、DELETE、PUT来表示对于资源的增删改查。

    • GET:读取(Read)
    • POST:新建(Create)
    • PUT:更新(Update)
    • DELETE:删除(Delete)

    学习资料准备:

    (1)用于测试的实体类:

    public class Student
    {
        public string StuNo { get; set; }    //学号
        public string StuName { get; set; }  //姓名
        public string StuSex { get; set; }   //性别
    }
    

    (2)模拟的测试数据(编写在webapi类的构造函数中):

    public static List<Student> StuList { get; set; }
    public ServerController()
    {
        StuList = new List<Student>();
        StuList.Add(new Student { StuNo = "001", StuName = "孙悟空", StuSex = "男" });
        StuList.Add(new Student { StuNo = "002", StuName = "猪八戒", StuSex = "男" });
        StuList.Add(new Student { StuNo = "003", StuName = "白骨精", StuSex = "女" });
    }
    

    二、获取所有数据

    API接口:

    [HttpGet]
    public List<Student> GetList([FromBody]dynamic obj)
    {
    	return StuList;
    }
    

    三、获取详情

    API接口:

    [HttpGet]
    public Student GetDetail(string id)
    {
    	Student stu = StuList.SingleOrDefault(p => p.StuNo.Equals(id));
    	return stu;
    }
    

    四、新增数据

    API接口:

    [HttpPost]
    public IHttpActionResult Add([FromBody] Student stu)
    {
        StuList.Add(stu);
        return Json(new { msg = "添加成功!",data=StuList });
    }
    

    五、修改数据

    API接口:

    [HttpPut]
    public IHttpActionResult Update(string id, [FromBody] Student stu)
    {
        Student model = StuList.SingleOrDefault(p => p.StuNo.Equals(id));
        if (model == null)
        	return Json(new { msg = "修改的数据不存在!" });
        model.StuNo = stu.StuNo;
        model.StuName = stu.StuName;
        model.StuSex = stu.StuSex;
        return Json(new { msg = "修改成功!", data = model });
    }
    

    六、删除数据

    API接口:

    [HttpDelete]
    public IHttpActionResult Delete(string id)
    {
        Student model = StuList.SingleOrDefault(p => p.StuNo.Equals(id));
        if (model == null)
        	return Json(new { msg = "删除的数据不存在!" });
        StuList.Remove(model);
        return Json(new { msg = "删除成功!", data = StuList });
    }
    

    七、特性路由

    (1) 基本路由映射

    API接口:

    [HttpGet]
    [Route("api/Route/Basic")]
    public IHttpActionResult GetBasic()
    {
    	return Json(new { msg = "测试基本的特性路由!" });
    }
    

    接口访问地址:

    http://localhost:60650/api/Route/Basic
    

    (2) 路由映射参数

    API接口:

    [HttpGet]
    [Route("api/Route/Param/{id}/{name}")]
    public IHttpActionResult Get2(string id,string name)
    {
    	return Json(new { msg = "测试路由映射参数!",data = new { id= id,name=name } });
    }
    

    接口访问地址:

    http://localhost:60650/api/Route/Param/001/孙悟空
    

    (3) 多重特性路由

    API接口:

    [HttpGet]
    [Route("api/Route/Multiple1/{id}/{name}")]
    [Route("api/Route/Multiple2/{id}/{name}")]
    public IHttpActionResult Get3(string id,string name)
    {
    	return Json(new { msg = "测试多重特性路由!",data = new { id= id,name=name } });
    }
    

    接口访问地址:

    http://localhost:60650/api/Route/Multiple1/001/孙悟空
    

    http://localhost:60650/api/Route/Multiple2/001/孙悟空
    

    (4) 缺省参数路由

    API接口:

    [HttpGet]
    [Route("api/Route/Default/{id}/{name?}")]
    public IHttpActionResult Get4(string id, string name="孙悟空")
    {
        return Json(new { msg = "测试缺省参数路由!", data = new { id = id, name = name } });
    }
    

    [HttpGet]
    [Route("api/Route/Default/{id}/{name=孙悟空}")]
    public IHttpActionResult Get4(string id, string name)
    {
    	return Json(new { msg = "测试缺省参数路由!", data = new { id = id, name = name } });
    }
    

    接口访问地址:

    http://localhost:60650/api/Route/Default/001
    

    (5) 参数约束路由

    ASP.NET Web API内置约束有下面这些:

    {x:alpha} 约束大小写英文字母
    {x:bool}
    {x:datetime}
    {x:decimal}
    {x:double}
    {x:float}
    {x:guid}
    {x:int}
    {x:length(6)}
    {x:length(1,20)} 约束长度范围
    {x:long}
    {x:maxlength(10)}
    {x:min(10)}
    {x:range(10,50)} //约束值的范围
    {x:regex(正则表达式)}
    

    可以设置多个约束:

    [Route("api/Route/orders/{id:int:min(1)}")]
    

    API接口:

    [HttpGet]
    [Route("api/Route/Check/{id:range(1,100)}/{name}")]
    public IHttpActionResult Get5(int id, string name)
    {
    	return Json(new { msg = "测试参数约束路由!", data = new { id = id, name = name } });
    }
    

    接口访问地址:(以下地址可以正常访问接口)

    http://localhost:60650/api/Route/Check/11/孙悟空
    

    接口访问地址:(以下地址无法访问接口)

    http://localhost:60650/api/Route/Check/101/孙悟空
    

    (6) 通配符(*)路由变量

    API接口:

    [HttpGet]
    [Route("api/Route/Date/{id:range(1,100)}/{name}/{*birthday}")]
    public IHttpActionResult Get6(int id, string name,DateTime birthday)
    {
    	return Json(new { msg = "*使用!", data = new { id = id, name = name,birthday = birthday.ToString("yyyy年MM月dd日") } });
    }
    

    接口访问地址:

    http://localhost:60650/api/Route/Date/1/jack/1988-8-8
    

    接口访问地址:(此地址如果在路由中没有*则无法访问,因为程序会认为“1988/8/8”是三个参数,而不是一个参数)

    http://localhost:60650/api/Route/Date/1/jack/1988/8/8
    

    (7) 路由映射复杂参数

    给实体类添加特性使其支持绑定:

    [ModelBinder]
    public class Student
    {
    	public string StuNo { get; set; }    //学号
    	public string StuName { get; set; }  //姓名
    	public string StuSex { get; set; }   //性别
    }
    

    方案一API接口:

    [HttpGet]
    [Route("api/Route/Class/{stu.StuNo}/{stu.StuName}/{stu.StuSex}")]
    public IHttpActionResult Get7(Student stu)
    {
    	return Json(new { msg = "路由映射复杂参数!", data = stu });
    }
    

    方案一接口访问地址:

    http://localhost:60650/api/Route/Class/001/jack/man
    

    方案二API接口:

    [HttpGet]
    [Route("api/Route/Class")]
    public IHttpActionResult Get7(Student stu)
    {
    	return Json(new { msg = "路由映射复杂参数!", data = stu });
    }
    

    方案二接口访问地址:

    http://localhost:60650/api/Route/Class?stu.StuNo=001&stu.StuName=jack&stu.StuSex=man
    

    (8) 路由前缀

    在控制器类上定义路由前缀:

    [RoutePrefix("api/Prefix")]
    public class PrefixController : ApiController
    {
    
    }
    

    路由前缀API接口:

    [Route("Basic")]
    public IHttpActionResult Get1()
    {
    	return Json(new { msg = "测试路由前缀!" });
    }
    

    接口访问地址:

    http://localhost:60650/api/Prefix/Basic
    

    取消路由前缀API接口:

    [Route("~/api/Cancel/Basic")]  //通过~/取消路由前缀
    public IHttpActionResult Get2()
    {
    	return Json(new { msg = "取消路由前缀!" });
    }
    

    接口访问地址:

    http://localhost:60650/api/Cancel/Basic
    

    本文来自博客园,作者:農碼一生,转载请注明原文链接:https://www.cnblogs.com/wml-it/p/15623167.html


    技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
    个人开源代码链接:
    GitHub:https://github.com/ITMingliang
    Gitee:https://gitee.com/mingliang_it
    GitLab:https://gitlab.com/ITMingliang
    进开发学习交流群:

  • 相关阅读:
    面向对象编程的三大特性之一:继承与派生
    面向对象编程
    计算器作业(摘要算法)
    模块&包
    文件的查询、修改实例+tag的用法++函数+程序的解耦
    函数闭包与装饰器
    Python开发【第五篇】:Python基础之杂货铺 day14 06
    Python开发【第四篇】:Python基础之函数 day14--08
    文件操作
    第七篇 python基础之函数,递归,内置函数lhf -blogs day14-8
  • 原文地址:https://www.cnblogs.com/wml-it/p/15623167.html
Copyright © 2020-2023  润新知