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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM