「把书籍数据暴露成接口,供前端、移动端、第三方调用」
MVC 是生成网页的,Web API 是生成数据的。同一套书籍数据,MVC返回HTML页面,Web API返回JSON。本系列继续用书籍做示例。
Web API 是什么?
简单说:Web API就是 不带页面的接口 。
|
对比 |
MVC |
Web API |
|---|---|---|
|
返回内容 |
HTML页面 |
JSON数据 |
|
调用方 |
浏览器(人) |
前端App、移动端、第三方(机器) |
|
用途 |
展示网页 |
提供数据 |
举例:
GET /api/books → 返回所有书籍列表(JSON)
GET /api/books/1 → 返回Id=1的书籍(JSON)
POST /api/books → 新增一本书
PUT /api/books/1 → 修改Id=1的书籍
DELETE /api/books/1 → 删除Id=1的书籍
这就是REST API风格,用HTTP动词表达操作。
创建 Web API 项目
创建一个Web API项目,名称为MyWebAPI



VS 自动创建 Web API 项目,结构如下:
MyWebAPI/
├── Controllers/ ← 接口控制器
├── Program.cs
└── appsettings.json
注意和MVC的区别:没有 Views 文件夹,由于不返回HTML页面,只返回JSON。
创建书籍模型
添加模型文件夹 Models,在文件夹添加类 Book.cs :
namespaceMyWebAPI.Models{publicclassBook{publicint Id { get; set; }// 书名publicrequiredstring Title { get; set; }// 作者publicrequiredstring Author { get; set; }// 价格publicdecimal Price { get; set; }}}
创建书籍接口(Controller)
在 Controllers 文件夹添加控制器 BooksController.cs :
using Microsoft.AspNetCore.Mvc;using MyWebAPI.Models;namespaceMyWebAPI.Controllers{[Route("api/[controller]")][ApiController]publicclassBooksController : ControllerBase{// 模拟数据库privatestatic List _books = new List {new Book { Id =1, Title ="C#入门", Author ="张三", Price =59.9m },new Book { Id =2, Title ="ASP.NET实战", Author ="李四", Price =89.9m },new Book { Id =3, Title ="Entity Framework Core", Author ="王五", Price =79.9m }};// GET /api/books — 获取所有书籍[HttpGet]public IActionResult GetAll{returnOk(_books);}// GET /api/books/1 — 获取单本书籍[HttpGet("{id}")]public IActionResult GetById(int id){var book = _books.FirstOrDefault(b => b.Id == id);if (book == )return NotFound(new{message = $"书籍 {id} 不存在"});returnOk(book);}// POST /api/books — 新增书籍[HttpPost]public IActionResult Create([FromBody] Book book){book.Id = _books.Max(b => b.Id) + 1;_books.Add(book);returnCreatedAtAction(nameof(GetById),new { id = book.Id }, book);}// PUT /api/books/1 — 修改书籍[HttpPut("{id}")]public IActionResult Update(int id, [FromBody] Book book){var existing = _books.FirstOrDefault(b => b.Id == id);if (existing == )return NotFound;existing.Title = book.Title;existing.Author = book.Author;existing.Price = book.Price;return Ok(existing);}// DELETE /api/books/1 — 删除书籍[HttpDelete("{id}")]public IActionResult Delete(int id){var book = _books.FirstOrDefault(b => b.Id == id);if (book == )return NotFound;_books.Remove(book);returnOk(new{message = $"书籍 {id} 已删除"});}}}
关键点:
[Route("api/[controller]")]— 路由前缀是
/api/books[ApiController]— 自动启用模型验证
ControllerBase— API用基类,不带View支持
IActionResult— 可以返回各种HTTP状态码
常用返回类型
|
返回 |
说明 |
HTTP状态码 |
|---|---|---|
Ok(data) |
成功返回数据 |
200 |
NotFound |
没找到 |
404 |
BadRequest |
请求错误 |
400 |
CreatedAtAction(...) |
创建成功 |
201 |
NoContent |
删除成功 |
204 |
测试接口
运行一下看看


在上图中的Curl中可以看到调用的Url,在浏览器中粘贴url看看

测试其他接口:
|
方法 |
URL |
说明 |
|---|---|---|
|
GET |
/api/books |
获取所有 |
|
GET |
/api/books/1 |
获取Id=1 |
|
POST |
/api/books |
新增(body传JSON) |
|
PUT |
/api/books/1 |
修改(body传JSON) |
|
DELETE |
/api/books/1 |
删除 |
REST 风格约定
|
HTTP方法 |
操作 |
示例 |
|---|---|---|
|
GET |
读取 |
GET /api/books, GET /api/books/5 |
|
POST |
新增 |
POST /api/books |
|
PUT |
完整修改 |
PUT /api/books/5 |
|
PATCH |
部分修改 |
PATCH /api/books/5 |
|
DELETE |
删除 |
DELETE /api/books/5 |
返回状态码要符合语义:新增返回201,删除返回204,找不到返回404。
常见问题
Q:为什么用 ControllerBase 而不是 Controller?
A:Web API不需要View,不需要Session,只需要返回数据。ControllerBase 更轻量。
Q:[FromBody] 是什么?
A:告知ASP.NET从请求Body中解析JSON数据,绑定到Book对象。
Q:POST和PUT有什么区别?
A:POST是新增(服务器生成Id),PUT是修改(客户端指定Id或通过URL指定)。
Q:怎么指定返回的JSON属性名大小写?
A:在 Program.cs 的 AddControllers 中配置 JsonPropertyName 或在模型上加 [JsonPropertyName("title")] 属性。
总结
Web API返回JSON数据,不返回页面。路由用 [Route] 和 [HttpGet/Post/Put/Delete] 标注,返回状态码要符合REST语义。同一套Book模型,MVC返回HTML,Web API返回JSON,满足不同调用方的需求。






[db:评论]