diff --git "a/\350\251\271\345\256\207\350\210\252/20241118.md" "b/\350\251\271\345\256\207\350\210\252/20241118.md" new file mode 100644 index 0000000000000000000000000000000000000000..62da5d0d9de3a1dd7a6bcb14991346bd6ebbad23 --- /dev/null +++ "b/\350\251\271\345\256\207\350\210\252/20241118.md" @@ -0,0 +1,322 @@ +# POST 请求的处理及示例 + +在 Web 开发中,`POST` 请求是常用的一种 HTTP 请求方法。常用于向服务器发送数据,例如提交表单或者向服务器发送 JSON 数据时。 + +## 1. `POST` 请求的基本概念 + +`POST` 请求用于向服务器发送数据,通常用来提交表单信息或者发送 JSON 数据。与 `GET` 请求不同,`POST` 请求的数据不会暴露在 URL 中,而是通过请求体发送。 + +### 为什么使用 `POST` 请求? + +- `POST` 请求的主要作用是提交数据,尤其是当数据量较大时,`GET` 请求不再适合,因为它会将数据暴露在 URL 中。 +- 服务器接收到 `POST` 请求后,可以对数据进行处理,可能还会返回相应的结果(如页面、JSON 数据等)。 + +## 2. 示例:接收并显示昵称 + +以下是一个简单的 ASP.NET Core 控制器示例,它接收客户端通过 `POST` 请求发送的 JSON 数据,获取其中的昵称并在网页上显示。 + +### 2.1. POST 请求头 + +##### 模拟POST请求 + +发送的 `POST` 请求头和数据示例如下: + +```http +POST http://localhost:5081/Post/Index HTTP/1.1 +Content-Type: application/json +``` + +请求体: + +```json +{ + "nickname": "测试名字" +} +``` + +- **请求头**:`Content-Type: application/json` 表示请求体中的数据是 JSON 格式。 +- **请求体**:包含了需要传输的数据,这里是 `nickname` 字段和它的值 `"测试名字"`。 + +##### 返回结果 + +```http +HTTP/1.1 200 OK +Connection: close +Content-Type: text/html; charset=utf-8 +Date: Mon, 18 Nov 2024 14:22:21 GMT +Server: Kestrel +Transfer-Encoding: chunked + +
接收到的昵称是:测试名字
+``` + +## 2.2. 控制器部分 + +### 2.2.1. 模型类 (`NicknameModel`) + +```csharp +public class NicknameModel +{ + public required string Nickname { get; set; } +} +``` + +- **作用**:模型类定义了一个 `Nickname` 字段,用于接收客户端发送的昵称。通过 `required` 关键字,确保客户端必须提供 `nickname` 数据,否则会出现错误。 + +### 2.2.2. 控制器类 (`PostController`) + +```csharp +public class PostController : Controller +{ + [HttpPost] + public IActionResult Index([FromBody] NicknameModel model) + { + // 从请求中获取昵称数据 + string nickname = model.Nickname; + + // 将昵称存储到 ViewData 中,以便在视图中使用 + ViewData["Nickname"] = nickname; + + // 返回视图 + return View(); + } +} +``` + +- **作用**:控制器接收 `POST` 请求中的数据,并将昵称存储到 `ViewData` 中,最后返回一个视图来显示该昵称。 + + `[FromBody]` 表示框架从请求体中获取数据,并将其自动转换为方法参数所需的类型。在此示例中,它会将请求体中的 JSON 数据转换为 `NicknameModel` 对象。 + +### 2.3. 视图部分 (`Index.cshtml`) + +```html +@using Microsoft.AspNetCore.Mvc.ViewFeatures +@{ + ViewData["Title"] = "昵称显示"; +} +接收到的昵称是:@Html.Raw(ViewData["Nickname"])
+@* @Html.Raw() 会告诉 Razor 引擎将 ViewData["Nickname"] 渲染为原始 HTML 内容,不进行转义。 *@ +``` + +- **作用**:视图部分用来显示传递过来的昵称。通过 `@ViewData["Nickname"]`,在页面中显示控制器传递过来的昵称数据。 + + 且通过 `@Html.Raw(ViewData["Nickname"])`,在页面中显示控制器传递过来的昵称数据。`@Html.Raw()` 会防止 HTML 转义,直接渲染原始内容。 + +### 2.4. 代码流向 + +1. **客户端**:通过 `POST` 请求发送 JSON 数据到服务器。 +2. **控制器**:接收并解析 `POST` 请求中的数据。 +3. **视图**:展示控制器传递的数据。 + +### 2.5. 总结 + +- **`POST` 请求**:用于向服务器提交数据。常用于表单提交或 JSON 数据交互。 +- **模型类**:用于接收客户端发送的 JSON 数据。 +- **控制器类**:处理 `POST` 请求,解析数据并传递给视图。 +- **视图部分**:显示控制器传递的数据,最终在网页上展现给用户。 + +# RESTful API 控制器 + +## RESTful API 基础知识 + +RESTful API 是一种基于 HTTP 协议的架构风格,用于构建网络应用的接口。它通过使用 HTTP 请求方法(如 GET、POST、PUT、DELETE)来执行对资源的操作。这些操作是基于对资源的 URL 路径进行请求并返回结果。以下是常见的 HTTP 请求方法及其用途: + +### 1. **GET** - 检索资源 + +`GET` 方法用于从服务器获取资源。它不会对服务器上的资源状态造成任何修改,因此它是**安全**的。 + +- **特点**: + - **安全**:不会修改资源,只是获取数据。 + - **幂等**:多次执行相同的请求将返回相同结果,不会对资源产生影响。 + - **使用场景**:用于查询、查看资源等。 + +- **示例**: + ```http + GET /api/products HTTP/1.1 + Host: example.com + ``` + +### 2. **POST** - 创建资源 + +`POST` 方法用于向服务器发送数据并创建资源。每次执行 `POST` 请求都会对服务器产生改变。 + +- **特点**: + - **非幂等**:每次请求都会修改服务器状态。 + - **用于提交数据**:数据通过请求体传送。 + - **使用场景**:用于创建新资源或提交表单数据。 + +- **示例**: + ```http + POST /api/products HTTP/1.1 + Host: example.com + Content-Type: application/json + + { + "name": "新产品", + "price": 100.0 + } + ``` + +### 3. **PUT** - 更新资源 + +`PUT` 方法用于更新现有资源,通常是完全替换资源的内容。 + +- **特点**: + - **幂等**:多次请求将返回相同结果。 + - **完全替换**:`PUT` 会完全替换目标资源的数据,未提供的字段可能会被删除或置为默认值。 + - **使用场景**:用于更新资源(例如修改记录或编辑内容)。 + +- **示例**: + ```http + PUT /api/products/123 HTTP/1.1 + Host: example.com + Content-Type: application/json + + { + "name": "更新后的产品", + "price": 120.0 + } + ``` + +### 4. **DELETE** - 删除资源 + +`DELETE` 方法用于删除服务器上的指定资源。 + +- **特点**: + - **非幂等**:如果资源已被删除,再次请求删除将会返回不同的响应。 + - **删除资源**:用于删除指定资源。 + - **使用场景**:用于删除记录、资源或文件。 + +- **示例**: + ```http + DELETE /api/products/123 HTTP/1.1 + Host: example.com + ``` + +--- + +## RESTful API 路由设计示例 + +### 产品 API + +#### 1. 获取产品列表 + +- **HTTP 方法**:`GET` +- **URL**:`/products` +- **说明**:获取所有产品的列表。 + +- **示例请求**: + ```http + GET /products HTTP/1.1 + Host: localhost:5000 + ``` + +#### 2. 获取单个产品 + +- **HTTP 方法**:`GET` +- **URL**:`/products/{id}` +- **说明**:获取指定 ID 的产品信息。 + +- **示例请求**: + ```http + GET /products/33 HTTP/1.1 + Host: localhost:5000 + ``` + +#### 3. 创建新产品 + +- **HTTP 方法**:`POST` +- **URL**:`/products` +- **说明**:创建一个新产品,产品信息在请求体中传递。 + +- **请求体示例**: + ```json + { + "name": "新产品", + "price": 99.99 + } + ``` + +#### 4. 更新产品信息 + +- **HTTP 方法**:`PUT` +- **URL**:`/products/{id}` +- **说明**:更新指定 ID 的产品信息。 + +- **请求体示例**: + ```json + { + "name": "更新后的产品名", + "price": 109.99 + } + ``` + +#### 5. 删除产品 + +- **HTTP 方法**:`DELETE` +- **URL**:`/products/{id}` +- **说明**:删除指定 ID 的产品。 + +- **示例请求**: + ```http + DELETE /products/18 HTTP/1.1 + Host: localhost:5000 + ``` + +--- + +## 图书 API + +#### 1. 获取图书评论列表 + +- **HTTP 方法**:`GET` +- **URL**:`/books/{id}/comments` +- **说明**:获取指定书籍的评论列表。 + +- **示例请求**: + ```http + GET /books/13/comments HTTP/1.1 + Host: localhost:5000 + ``` + +#### 2. 添加图书评论 + +- **HTTP 方法**:`POST` +- **URL**:`/books/{id}/comments` +- **说明**:给指定书籍添加一条评论。 + +- **请求体示例**: + ```json + { + "comment": "这本书非常有趣!", + "rating": 5 + } + ``` + +#### 3. 更新图书评论 + +- **HTTP 方法**:`PUT` +- **URL**:`/books/{id}/comments/{commentId}` +- **说明**:更新指定书籍的指定评论。 + +- **请求体示例**: + ```json + { + "comment": "修改后的评论内容", + "rating": 4 + } + ``` + +#### 4. 删除图书评论 + +- **HTTP 方法**:`DELETE` +- **URL**:`/books/{id}/comments/{commentId}` +- **说明**:删除指定书籍的指定评论。 + +- **示例请求**: + ```http + DELETE /books/13/comments/18 HTTP/1.1 + Host: localhost:5000 + ``` + +--- \ No newline at end of file diff --git "a/\350\251\271\345\256\207\350\210\252/20241120.md" "b/\350\251\271\345\256\207\350\210\252/20241120.md" new file mode 100644 index 0000000000000000000000000000000000000000..1dc0c8868fb042b3242b52a737a9e95ee661a516 --- /dev/null +++ "b/\350\251\271\345\256\207\350\210\252/20241120.md" @@ -0,0 +1,190 @@ + +## 一、路由模式解析 + +路由模式定义了 URL 的结构以及如何将其映射到控制器的操作方法中。ASP.NET Core 默认的路由模式为: + +```csharp +"{controller=Home}/{action=Index}/{id?}" +``` + +### 1. 路由模式的组成部分 + +- **`{controller=Home}`** + 指定控制器的占位符。如果 URL 中未明确指定控制器,则使用 `HomeController` 作为默认值。 + +- **`{action=Index}`** + 指定操作方法的占位符。如果 URL 中未明确指定操作方法,则使用 `Index` 作为默认值。 + +- **`{id?}`** + 表示一个可选的参数,占位符为 `id`,可以传递到控制器方法中。 + +--- + +### 2. 控制器中使用路由参数 + +路由参数与控制器方法中的参数名对应,以下是一个简单的示例: + +```csharp +using Microsoft.AspNetCore.Mvc; + +namespace MyFirstMvc.Controllers +{ + public class HomeController : Controller + { + [HttpGet] + public IActionResult Index(int id) + { + var model = GetModelById(id); + return View(model); + } + + private MyModel GetModelById(int id) + { + return new MyModel { Id = id, Name = "示例" }; + } + } + + public class MyModel + { + public int Id { get; set; } + public string Name { get; set; } + } +} +``` + +#### URL 请求示例 +当用户访问 `http://localhost:5000/Home/Index/5` 时: +1. **控制器**: 匹配到 `HomeController`。 +2. **操作方法**: 匹配到 `Index` 方法。 +3. **参数**: 路由参数 `id` 的值为 `5`,并传递到 `Index` 方法中。 + +--- + +### 3. 参数名的匹配规则 + +在路由模式中,`{id?}` 定义了一个可选参数,其名称为 `id`。控制器方法的参数名必须与此占位符一致,例如: +- 如果路由模式为 `{productId?}`,则方法参数名应为 `productId`。 + +- 参数名不匹配时,将导致请求无法正确解析参数。 + +#### 为什么参数名必须是 `id` + + 在路由模式中, `{id?}` 表示一个可选的URL参数,占位符名称为 `id`。在控制器方法中,参数名称也必须与占位符名称匹配,即 `id`。如果路由模式中使用了其他参数名,例如 `{productId?}`,那么控制器方法中的参数名也应相应更改为 `productId`。 + +--- + +### 4. 总结 + +路由模式 `"{controller=Home}/{action=Index}/{id?}"` : +- 允许通过 URL 直接访问控制器和方法。 +- 参数名需要与占位符一致,避免请求解析问题。 + +--- + +## 二、ASP.NET Core `launchSettings.json` 配置详解 + +`launchSettings.json` 文件位于 ASP.NET Core 项目的 `Properties` 文件夹中,用于配置开发环境下的启动选项。以下是你的 `launchSettings.json` 文件解析: + +```json +{ + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5254", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7023;http://localhost:5254", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} +``` + +--- + +### 1. 配置字段解析 + +#### **`profiles`** +每个配置文件(如 `http` 和 `https`)对应一个启动选项,可用于指定不同的启动模式。 + +#### **`commandName`** +- 指定启动方式。 +- `"Project"`:表示以当前项目为启动对象,常用于开发和调试。 +- `"IISExpress"`:表示使用 IIS Express 启动。 + +--- + +#### **`dotnetRunMessages`** +- 控制是否在控制台显示 `dotnet run` 的详细信息。 +- `true`:启用(推荐用于调试)。 +- `false`:关闭。 + +--- + +#### **`launchBrowser`** +- 是否自动打开浏览器访问启动 URL。 +- `true`:自动打开。 +- `false`:不打开。 + +--- + +#### **`applicationUrl`** +- 定义应用程序启动时绑定的 URL 地址。 +- 可配置多个地址,用分号分隔。 +- 示例: + - `"http://localhost:5254"`:通过 HTTP 协议访问。 + - `"https://localhost:7023;http://localhost:5254"`:支持 HTTPS 和 HTTP。 + +--- + +#### **`environmentVariables`** +- 设置运行时的环境变量。 +- 常用环境变量: + - `"ASPNETCORE_ENVIRONMENT"`:指定环境类型。 + - `"Development"`:开发环境,通常启用详细错误信息和调试功能。 + - `"Production"`:生产环境,启用优化和更高的安全性。 + +--- + +### 2. 配置解读 + +#### **HTTP 配置** +- 使用 HTTP 协议启动。 +- 默认地址为 `http://localhost:5254`。 +- 启动时自动打开浏览器。 +- 运行环境为 `Development`。 + +#### **HTTPS 配置** +- 支持 HTTPS 和 HTTP。 +- 默认地址为: + - `https://localhost:7023` + - `http://localhost:5254` +- 启动时自动打开浏览器。 +- 运行环境为 `Development`。 + +--- + +### 3. 使用场景 +- **调试与开发**:快速配置和启动调试环境。 +- **环境区分**:通过 `ASPNETCORE_ENVIRONMENT` 区分开发、测试和生产环境。 +- **本地测试**:设置 URL 和端口号,避免冲突或重复。 + +--- + +### 4. 总结 + +`launchSettings.json` 提供了灵活的启动选项配置,快速启动和调试 ASP.NET Core 应用程序: + +1. 使用多个协议(HTTP 和 HTTPS)。 +2. 设置开发环境变量。 +3. 自动打开浏览器提高开发效率。 \ No newline at end of file