C#教程(四十四)Web API 入门

「把书籍数据暴露成接口,供前端、移动端、第三方调用」

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

C#教程(四十四)Web API 入门C#教程(四十四)Web API 入门C#教程(四十四)Web API 入门

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 {return Ok(_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} 不存在" });return Ok(book); }// POST /api/books — 新增书籍 [HttpPost]public IActionResult Create([FromBody] Book book) { book.Id = _books.Max(b => b.Id) + 1; _books.Add(book);return CreatedAtAction(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);return Ok(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

测试接口

运行一下看看

C#教程(四十四)Web API 入门C#教程(四十四)Web API 入门

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

C#教程(四十四)Web API 入门

测试其他接口:

方法

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,满足不同调用方的需求。

© 版权声明

相关文章

1 条评论

  • 头像
    O瑶瑶酱哦O 投稿者

    [db:评论]

    无记录
    回复