From a266c7aa8a875afe2fc2a879add308d8dd60c5aa Mon Sep 17 00:00:00 2001 From: zhao <123> Date: Sun, 26 May 2024 23:39:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0516webapi\345\205\245\351\227\250.md" | 108 ++++++++++++++ ...60\345\273\272\351\241\271\347\233\256.md" | 17 +++ ...nd\344\270\255\351\227\264\344\273\266.md" | 134 ++++++++++++++++++ ...35\350\265\226\346\263\250\345\205\245.md" | 73 ++++++++++ ...5\350\265\226\346\263\250\345\205\2452.md" | 126 ++++++++++++++++ 5 files changed, 458 insertions(+) create mode 100644 "\350\256\270\345\205\260\350\216\271/0516webapi\345\205\245\351\227\250.md" create mode 100644 "\350\256\270\345\205\260\350\216\271/0520\346\226\260\345\273\272\351\241\271\347\233\256.md" create mode 100644 "\350\256\270\345\205\260\350\216\271/0521\351\241\271\347\233\256\347\232\204\345\210\233\345\273\272and\344\270\255\351\227\264\344\273\266.md" create mode 100644 "\350\256\270\345\205\260\350\216\271/0523\344\276\235\350\265\226\346\263\250\345\205\245.md" create mode 100644 "\350\256\270\345\205\260\350\216\271/0524\344\276\235\350\265\226\346\263\250\345\205\2452.md" diff --git "a/\350\256\270\345\205\260\350\216\271/0516webapi\345\205\245\351\227\250.md" "b/\350\256\270\345\205\260\350\216\271/0516webapi\345\205\245\351\227\250.md" new file mode 100644 index 0000000..917184a --- /dev/null +++ "b/\350\256\270\345\205\260\350\216\271/0516webapi\345\205\245\351\227\250.md" @@ -0,0 +1,108 @@ +### 学习目标 + +* 了解Web API是什么以及它的主要用途 +* 能够创建和使用简单的Web API +* 了解Web API的路由和HTTP方法 +* 能够处理Web API的请求和响应 +* 了解Web API的安全性措施 + +### 内容大纲 + +#### 1\. Web API基础 + +* 什么是Web API? +* Web API的主要用途 +* Web API的架构 + +#### 2\. 创建简单的Web API + +* 使用ASP.NET Core创建Web API +* 了解Web API的控制器和方法 +* 测试Web API + +#### 3\. Web API的路由和HTTP方法 + +* 了解Web API的路由 +* 了解HTTP方法 +* 使用路由和HTTP方法 + +#### 4\. 处理Web API的请求和响应 + +* 处理HTTP请求 +* 处理HTTP响应 +* 返回不同类型的数据 + +#### 5\. Web API的安全性 + +* 了解Web API的安全性 +* 身份验证和授权 +* 数据加密 + +#### 6\. 进阶主题 + +* Web API的版本控制 +* Web API的文档化 +* Web API的测试和调试 + + + +## Web API入门笔记 + +#### 1\. 什么是Web API? + +Web API是一种允许软件应用之间进行交互的技术。它提供了一组接口,通过这些接口,应用程序可以请求和接收数据,或者执行特定的操作。Web API通常使用HTTP协议进行通信,可以返回数据格式如JSON或XML。 + +#### 2\. Web API的主要用途 + +* **数据交换**:允许不同的应用程序共享和交换数据。 +* **服务集成**:集成第三方服务,如支付、地图、社交网络等。 +* **自动化**:自动化任务,如数据同步、报告生成等。 + +#### 3\. 创建一个简单的Web API + +以下是一个使用ASP.NET Core创建的简单Web API示例: +```js + using Microsoft.AspNetCore.Mvc; + + namespace MyWebApi.Controllers + { + [ApiController] + [Route("[controller]")] + public class HelloWorldController : ControllerBase + { + [HttpGet] + public ActionResult Get() + { + return "Hello, World!"; + } + } + } +``` + +在这个示例中,我们创建了一个名为`HelloWorldController`的控制器,它包含一个`Get`方法,当通过HTTP GET请求访问时,返回字符串"Hello, World!"。 + +#### 4\. Web API的路由和方法 + +* **路由**:定义了如何将HTTP请求映射到控制器的方法上。在上面的例子中,`[Route("[controller]")]`意味着控制器的方法可以通过`/HelloWorld`访问。 +* **方法**:如`[HttpGet]`,指定了HTTP请求的类型。Web API支持多种HTTP方法,如GET、POST、PUT、DELETE等。 + +#### 5\. 处理请求和响应 + +* **请求**:客户端通过HTTP请求发送数据到Web API。 +* **响应**:Web API处理请求后,通过HTTP响应返回数据给客户端。 + +#### 6\. 测试Web API + +可以使用工具如Postman或浏览器来测试Web API。例如,对于上面的`HelloWorldController`,可以在浏览器中输入`http://localhost:5000/HelloWorld`来查看返回的"Hello, World!"。 + +#### 7\. 安全性 + +Web API的安全性非常重要,常见的安全措施包括: + +* **身份验证**:验证用户的身份。 +* **授权**:确定用户是否有权限访问特定的资源。 +* **数据加密**:保护数据在传输过程中的安全。 + +#### 8\. 总结 + +Web API是现代软件开发中的一个重要组成部分,它允许不同的应用程序和服务之间进行有效的通信和数据交换。通过学习和实践,你可以掌握如何创建和使用Web API来增强你的应用程序的功能和灵活性。 \ No newline at end of file diff --git "a/\350\256\270\345\205\260\350\216\271/0520\346\226\260\345\273\272\351\241\271\347\233\256.md" "b/\350\256\270\345\205\260\350\216\271/0520\346\226\260\345\273\272\351\241\271\347\233\256.md" new file mode 100644 index 0000000..6e5bd01 --- /dev/null +++ "b/\350\256\270\345\205\260\350\216\271/0520\346\226\260\345\273\272\351\241\271\347\233\256.md" @@ -0,0 +1,17 @@ +# 创建一个新的webapi项目 + +## 1/.先决条件 + - VScode + - 用于vscode的C# + - .NET 8.0 SDK +## 2/. + 打开终端,输入: + + **创建** + - dotnet new webapi -o/-n 项目名称 + + **打开** + - cd 项目名称 + + **启动** + - dotnet run/dotnet watch --project .\项目名称\ \ No newline at end of file diff --git "a/\350\256\270\345\205\260\350\216\271/0521\351\241\271\347\233\256\347\232\204\345\210\233\345\273\272and\344\270\255\351\227\264\344\273\266.md" "b/\350\256\270\345\205\260\350\216\271/0521\351\241\271\347\233\256\347\232\204\345\210\233\345\273\272and\344\270\255\351\227\264\344\273\266.md" new file mode 100644 index 0000000..71090bd --- /dev/null +++ "b/\350\256\270\345\205\260\350\216\271/0521\351\241\271\347\233\256\347\232\204\345\210\233\345\273\272and\344\270\255\351\227\264\344\273\266.md" @@ -0,0 +1,134 @@ + +### Web API 入门笔记 + +#### XMLHttpRequest + +XMLHttpRequest 是 Web API 中最基本的网络请求方法,用于发送 HTTP 请求并获取服务器响应。 + +**用法**: + + const xhr = new XMLHttpRequest(); + xhr.open('GET', 'https://api.example.com/data'); + xhr.onload = function() { + if (xhr.status === 200) { + console.log(xhr.responseText); + } else { + console.log('Request failed. Status code:', xhr.status); + } + }; + xhr.send(); + + +**使用场景**: 适用于简单的网络请求,但不支持 Promise 和 async/await 语法。 + +#### Fetch API + +Fetch API 是 Web API 中另一种网络请求方法,使用 Promise 和 async/await 语法,更加简单易用。 + +**用法**: +```js + + fetch('https://api.example.com/data') + .then(response => { + if (response.ok) { + return response.text(); + } else { + throw new Error('Request failed. Status code:', response.status); + } + }) + .then(data => { + console.log(data); + }) + .catch(error => { + console.error(error); + }); + ``` + +**使用场景**: 适用于需要使用 Promise 和 async/await 语法的网络请求。 + +#### Web Storage + +Web Storage 是 Web API 中用于在浏览器中存储数据的 API,包括 localStorage 和 sessionStorage。 + +**用法**: +```js + // 存储数据 + localStorage.setItem('name', 'John Doe'); + + // 获取数据 + const name = localStorage.getItem('name'); + + // 删除数据 + localStorage.removeItem('name'); + + // 清空所有数据 + localStorage.clear(); +``` + +**使用场景**: 适用于需要在浏览器中存储少量数据的场景,如保存用户偏好或登录状态。 + +### 中间件入门笔记 + +中间件是一种在 Web 应用中处理请求和响应的函数,用于在请求到达服务器后进行预处理和后处理。下面我将介绍两种常见的中间件:Express 和 Koa。 + +#### Express 中间件 + +Express 是 Node.js 中最常用的 Web 框架,提供了一系列中间件函数来处理请求和响应。 + +**用法**: +```js + const express = require('express'); + const app = express(); + + // 定义中间件函数 + const myMiddleware = (req, res, next) => { + console.log('Log:', req.url); + next(); + }; + + // 使用中间件函数 + app.use(myMiddleware); + + // 定义路由 + app.get('/', (req, res) => { + res.send('Hello World!'); + }); + + // 启动服务器 + app.listen(3000, () => { + console.log('Server listening on port 3000.'); + }); +``` + +**使用场景**: 适用于需要在 Node.js 中快速搭建 Web 应用的场景。 + +#### Koa 中间件 + +Koa 是一个更加轻量级的 Web 框架,也提供了中间件函数来处理请求和响应。 + +**用法**: +```js + const Koa = require('koa'); + const app = new Koa(); + + // 定义中间件函数 + const myMiddleware = async (ctx, next) => { + console.log('Log:', ctx.url); + await next(); + }; + + // 使用中间件函数 + app.use(myMiddleware); + + // 定义路由 + app.use(async ctx => { + ctx.body = 'Hello World!'; + }); + + // 启动服务器 + app.listen(3000, () => { + console.log('Server listening on port 3000.'); + }); + +``` +**使用场景**: 适用于需要在 Node.js 中构建更加高效和可扩展的 Web 应用的场景。 \ No newline at end of file diff --git "a/\350\256\270\345\205\260\350\216\271/0523\344\276\235\350\265\226\346\263\250\345\205\245.md" "b/\350\256\270\345\205\260\350\216\271/0523\344\276\235\350\265\226\346\263\250\345\205\245.md" new file mode 100644 index 0000000..68d66ee --- /dev/null +++ "b/\350\256\270\345\205\260\350\216\271/0523\344\276\235\350\265\226\346\263\250\345\205\245.md" @@ -0,0 +1,73 @@ + +### 依赖注入的基本概念 + +在依赖注入中,有三个角色: + +* **服务提供者(Service Provider)**: 负责创建和管理对象的实例。 +* **服务接口(Service Interface)**: 定义对象之间的依赖关系,服务提供者需要实现该接口。 +* **服务使用者(Service User)**: 依赖于服务接口,需要在运行时注入服务提供者实例。 + +### 依赖注入的实现方式 + +有三种常见的依赖注入实现方式: + +* **构造函数注入(Constructor Injection)**: 在构造函数中传入服务提供者实例。 + +**用法**: +```js + class MyService { + constructor(myDependency) { + this.myDependency = myDependency; + } + + doSomething() { + // ... + } + } + + const myDependency = new Dependency(); + const myService = new MyService(myDependency); +``` +* **方法注入(Method Injection)**: 在方法中传入服务提供者实例。 + +**用法**: +```js + class MyService { + doSomething(myDependency) { + // ... + } + } + + const myDependency = new Dependency(); + const myService = new MyService(); + myService.doSomething(myDependency); + +``` + +* **属性注入(Property Injection)**: 在属性中传入服务提供者实例。 + +**用法**: +```js + class MyService { + constructor() { + this.myDependency = new Dependency(); + } + + doSomething() { + // ... + } + } + + const myService = new MyService(); +``` + +### 依赖注入的优点 + +* **解耦**: 依赖注入可以将对象之间的依赖关系解耦,使得对象之间的耦合度降低,提高代码的可重用性和可扩展性。 +* **可测试**: 依赖注入可以使对象之间的依赖关系变得可控,使得对象更加易于测试。 +* **可维护**: 依赖注入可以使代码的结构更加清晰,使得代码更加易于维护。 + +### 依赖注入的注意事项 + +* **依赖关系的数量**: 如果对象之间的依赖关系过多,可能会导致代码的复杂性过高,影响可读性和可维护性。 +* **依赖关系的稳定性**: 如果对象之间的依赖关系不稳定,可能会导致代码的变更过于频繁,影响代码的可维护性。 \ No newline at end of file diff --git "a/\350\256\270\345\205\260\350\216\271/0524\344\276\235\350\265\226\346\263\250\345\205\2452.md" "b/\350\256\270\345\205\260\350\216\271/0524\344\276\235\350\265\226\346\263\250\345\205\2452.md" new file mode 100644 index 0000000..9ea17fe --- /dev/null +++ "b/\350\256\270\345\205\260\350\216\271/0524\344\276\235\350\265\226\346\263\250\345\205\2452.md" @@ -0,0 +1,126 @@ +### 依赖注入的原则 + +在 Web API 中,依赖注入的原则如下: + +* **控制反转**: 将服务提供者和服务使用者的依赖关系反转过来,让服务提供者来负责创建和管理服务实例。 +* **解耦**: 通过依赖注入,可以将服务提供者和服务使用者解耦,使得它们可以独立地变化和测试。 +* **可测试**: 通过依赖注入,可以使得服务实例可以在单元测试中被替换成模拟对象,从而可以更好地测试服务的行为。 + +### 依赖注入的优点 + +在 Web API 中,依赖注入的优点如下: + +* **可维护**: 通过依赖注入,可以使得服务实例可以在不同的环境中被配置和管理,从而更容易地进行维护。 +* **可扩展**: 通过依赖注入,可以使得服务实例可以在不同的环境中被替换成不同的实现,从而更容易地扩展功能。 +* **可测试**: 通过依赖注入,可以使得服务实例可以在单元测试中被替换成模拟对象,从而可以更好地测试服务的行为。 + +### 依赖注入的实现 + +在 Web API 中,可以使用以下方式来实现依赖注入: + +* **自己实现**: 可以自己实现一个简单的依赖注入容器,来管理服务实例的创建和生命周期。 +* **使用第三方框架**: 可以使用第三方的依赖注入框架,例如 ASP.NET Core、Autofac、Ninject、Simple Injector 等,来管理服务实例的创建和生命周期。 + +### 依赖注入的配置 + +在 Web API 中,可以使用以下方式来配置依赖注入: + +* **代码配置**: 在代码中配置服务提供者和服务使用者之间的依赖关系。 + +**示例**: +```js + public void ConfigureServices(IServiceCollection services) + { + services.AddTransient(); + services.AddSingleton(); + } + +``` + +* **XML 配置**: 在 XML 配置文件中配置服务提供者和服务使用者之间的依赖关系。 + +**示例**: +```js + + + + + + +``` + +* **注解配置**: 在类和方法上添加注解,使用注解来配置服务提供者和服务使用者之间的依赖关系。 + +**示例**: +```js + [Service(ServiceLifetime.Transient)] + public class MyService : IMyService + { + // ... + } + + [Service(ServiceLifetime.Singleton)] + public class MyDependency : IMyDependency + { + // ... + } + +``` + +### 依赖注入的生命周期 + +在 Web API 中,可以使用以下生命周期来管理服务实例: + +* **Transient**: 每次请求都会创建一个新的服务实例。 +* **Singleton**: 整个应用程序只会创建一个服务实例。 +* **Scoped**: 每个请求都会创建一个新的服务实例,但是在同一个请求中,服务实例可以被重用。 + +### 依赖注入的使用 + +在 Web API 中,可以使用以下方式来使用依赖注入: + +* **构造函数注入**: 在构造函数中使用 `[Activate]` 注解来注入服务实例。 + +**示例**: +```js + public class MyController : ApiController + { + private readonly IMyService _myService; + + public MyController([Activate] IMyService myService) + { + _myService = myService; + } + + // ... + } +``` + +* **属性注入**: 在属性中使用 `[Activate]` 注解来注入服务实例。 + +**示例**: +```js + public class MyController : ApiController + { + [Activate] + public IMyService MyService { get; set; } + + // ... + } +``` + +* **方法注入**: 在方法中使用参数来注入服务实例。 + +**示例**: +```js + public class MyController : ApiController + { + // ... + + [HttpGet] + public IActionResult Get([Activate] IMyService myService) + { + // ... + } + } +``` -- Gitee