ASP.NET Core 3 高级编程(第8版) 学习笔记 04

第 19 章主要介绍 Restful Service 的相关知识。Restful Service 的核心内容是:(1)HTTP 请求或 HTTP 动词,用 HTTP 请求表达不同的操作,最好遵守惯例。(2)资源,通过 PATH 结合 payload 来表达。以本章的示例来说:

请添加图片描述

除 Restful Service 外,替代品包括 GraphQL 和 gRPC。

使用自定义的端点实现 Web Service

不同语言的 Web 框架,都需要解决 Routing 问题,也就是客户端提交的请求,服务器通过内部机制最终处理的方法或者函数。在 asp.net core 中,比较流程的方法就是实用 MVC 来实现路由。但在使用标准的 MVC 框架之前,本书介绍了通过自定义 endpoint 来实现的方法。结合第 18 章,也就是说解决路由问题可以有 3 种方法:
1)使用中间件
2)自定义 endpoint
3)使用 MVC 框架的 Controller

第一步:新建 WebserviceEndpoint 类,在该类中实现了获取所有 products,根据 id 获取 product 和创建一个新的 product 三个功能:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using System.Collections;
using System.Collections.Generic;
using System.Text.Json;
using WebApp.Models;namespace WebApp
{public static class WebServiceEndpoint{private static string BASE_URL = "api/products";public static void MapWebService(this IEndpointRouteBuilder app){// 匹配 GET: /api/products/{id}app.MapGet($"{BASE_URL}/{{id}}", async context =>{long key = long.Parse(context.Request.RouteValues["id"] as string);DataContext dbContext = context.RequestServices.GetService<DataContext>();var p = dbContext.Products.Find(key);if (p == null) {context.Response.StatusCode = StatusCodes.Status404NotFound;} else {context.Response.ContentType = "application/json";context.Response.StatusCode = StatusCodes.Status200OK;await context.Response.WriteAsync(JsonSerializer.Serialize<Product>(p));}});app.MapGet(BASE_URL, async context => {DataContext dbContext = context.RequestServices.GetService<DataContext>();context.Response.ContentType = "application/json";await context.Response.WriteAsync(JsonSerializer.Serialize<IEnumerable<Product>>(dbContext.Products));});app.MapPost(BASE_URL, async context => {DataContext dbContext = context.RequestServices.GetService<DataContext>();Product p = await JsonSerializer.DeserializeAsync<Product>(context.Request.Body);await dbContext.AddAsync(p);await dbContext.SaveChangesAsync();context.Response.StatusCode=StatusCodes.Status200OK;});}}
}

注意 MapService() 方法是 IEndpointRouteBuilder 的扩展方法

第二步:在 Startup 类的 Configure() 方法中注册服务:

测试自定义端点

测试建议使用流行的工具,比如 Postman,而不是使用书中所介绍的 Invoke-ReestMethod 等工具。打开 Postman,对自定义 endpoint 的 3 个功能进行测试:

提交后,在数据库中查看:

使用控制器创建 Web 服务

第一步:在 Startup 类的 ConfigureService() 方法中,将控制器的服务添加到指定的 IServiceCollection,并且在 Configure() 中,通过 endpoints.MapControllers(); 方法实现默认的路由。

第二步:创建 Controller ,定义 Action 方法。XXXController 从 ControllerBase 类派生

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using WebApp.Models;namespace WebApp.Controllers
{[Route("api/[controller]")][ApiController]public class ProductsController : ControllerBase{private DataContext dbContext;public ProductsController(DataContext dbContext){this.dbContext = dbContext;}// Get products[HttpGet]public IEnumerable<Product> GetProducts(){return dbContext.Products;}// Get product by Id[HttpGet("{id}")]public Product GetProduct(){return dbContext.Products.FirstOrDefault();}// Create product[HttpPost]public void SaveProduct([FromBody]Product p){dbContext.Products.Add(p);dbContext.SaveChanges();}}
}

Controller 实现了相同的功能,我们可以从中看到框架的好处。

源码

pro asp.net core 3 notes: 《ASP.NET Core 3高级编程(第8版)》学习笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32f4单片机强制类型转换为float程序跑飞问题

如题&#xff0c;在一个数据解析函数中使用了*(float *)&data[offset]&#xff0c;其中data为uint8类型指针&#xff0c;指向的value地址为 可以看到地址0x20013A31非对齐&#xff0c;最终在执行VLDR指令时导致跑飞 VLDR需要使用对齐访问 跑飞后查看SCB寄存器发现确实是非…

企业级开源版本管理系统GIT分析

作者:私语茶馆 1.开源版本管理各种易混淆概念 开源版本软件管理存在Git、GitHub、TortoiseGit等各种概念容易混淆,本文讲解这些系统的概念、用途和范围,以及如何基于开源软件搭建版本管理系统。GIT密切相关的几个软件概念和解释如下: gitHub:全球最大的代码托管和写作平台…

XiaodiSec day038 Learn Note 小迪安全学习笔记

XiaodiSec day038 Learn Note 小迪安全学习笔记 记录得比较凌乱&#xff0c;不尽详细 day 38 XSS XSS 的最后一节 结合 ctfshow 的题 316 - 331 关 16 题捏 开始 ctfshow 启动 使用 onerror 实践绕过对 script 的过滤 onload 时间能自动载入&#xff0c;加载自动执行 …

【网络安全】在网络中如何对报文和发送实体进行鉴别?

目录 1、报文鉴别 &#xff08;1&#xff09;使用数字签名进行鉴别 &#xff08;2&#xff09;密码散列函数 &#xff08;3&#xff09;报文鉴别码 2、实体鉴别 鉴别(authentication) 是网络安全中一个很重要的问题。 一是要鉴别发信者&#xff0c;即验证通信的对方的确是…

微博评论爬取

import requests import csv# 打开CSV文件以写入数据 f open(data.csv, modea, encodingutf-8-sig, newline) csv_writer csv.DictWriter(f, fieldnames[昵称, 性别, 归属地, 内容]) csv_writer.writeheader()# 定义一个函数用于获取评论内容 def GetContent(max_id):# 设置请…

【Harmony3.1/4.0】笔记五

概念 本文综合row&#xff0c;column作为主要布局&#xff0c;结合image组件&#xff0c;text组件&#xff0c;textimput组件&#xff0c;button组件以及轮播布局搭建登录页面 效果图 ArkTS代码 //登录综合页面 Entry Component struct Five{//添加图片State imgs:Resource[…

Typora使用的一些记录(自用)

Typora 是一个伪装成文本编辑器的浏览器。当你按下 Shift F12 快捷键或者右键检查元素时&#xff0c;页面会弹出一个基于 Chrome 的开发者工具栏。 1、Typora快捷键 标题(Ctrl1(2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6)) ps&#xff1a;分别是一级标题到六…

企业有哪些常见网络需求场景?

企业的网络场景需求多种多样&#xff0c;主要取决于其业务规模、运营模式、技术应用等因素。 常见的企业网络场景需求 办公网络需求&#xff1a; 高速稳定的内部网络连接&#xff0c;以支持员工日常办公、数据传输和资源共享。 无线办公网络覆盖&#xff0c;以便员工在会议室…

如何善用ChatGPT提升论文写作效率

ChatGPT无限次数:点击直达 如何善用ChatGPT提升论文写作效率 作为一名有10年经验的CSDN网站原创文章优质创作者&#xff0c;我深知在论文写作过程中&#xff0c;提升效率是至关重要的。近年来&#xff0c;人工智能技术的快速发展为我们提供了全新的可能性&#xff0c;其中Chat…

Mysql 锁学习笔记

Innodb锁 SQL 行锁类型说明INSERT ...排他锁自动加锁UPDATE ...排他锁自动加锁DELETE ...排他锁 自动加锁SELECT &#xff08;正常&#xff09;不加任何锁SELECT ... LOCK IN SHARE MODE共享锁在 SELECT 之后加 LOCK IN SHARE MODESELECT ... FOR UPDATE排他锁在 SELECT 之后加…

【LeetCode刷题记录】19. 删除链表的倒数第 N 个结点

19 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出…

大模型的实践应用22-谷歌Gemma AI大模型的架构原理,以及Gemma模型的部署安装本地教程

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用22-谷歌Gemma AI大模型的架构原理,以及Gemma模型的部署安装本地教程。谷歌Gemma AI大模型是由Google AI团队开发并开源。Gemma模型采用Transformer编码器-解码器架构,并加入了一些改进,例如使用稀疏注意力机制来提高推…

Qt 运行 Android 程序时找不到 Toou2D 库闪退

问题描述 程序闪退&#xff0c;错误信息如下&#xff0c;找不到库。 W libAndroid10_armeabi-v7a.so: QQmlApplicationEngine failed to load component W libAndroid10_armeabi-v7a.so: qrc:/main.qml:3:1: plugin cannot be loaded for module "Toou2D": Cannot …

【vue2+antvx6】节点大小不一致,点击按钮流程图自动布局

需求&#xff1a; 1、点击优化布局的按钮&#xff0c;自动布局&#xff08;从左到右&#xff09;&#xff0c;按钮变成撤销布局按钮 2、点击撤销布局的按钮&#xff0c;返回之前的布局 3、在点击优化布局的按钮后&#xff0c;如果移动了节点&#xff0c;则自动将撤销布局的按…

嵌入式Linux—Framebuffer应用编程

Framebuffer 应用编程 Frame的意思是帧&#xff0c;buffer的意思是缓冲区。Framebuffer就是一块内存(硬件设备)&#xff0c;里面保存着一帧图像。 ioctl()函数解析 ioctl()函数非常强大。不同的驱动程序内部会实现不同的 ioctl() &#xff0c;可以使用各种 ioctl() 跟驱动程序…

世媒讯提供海内外媒体宣发服务,引领企业新媒体发展之路

在这个信息化的时代&#xff0c;软文发稿已经成为企业发展不可或缺的重要工具。随着社会的快速发展&#xff0c;消费者需要更多定制化、个性化的信息。利用软性推广&#xff0c;凭借其细致入微的信息传递&#xff0c;可以迅速抓住消费者的注意力&#xff0c;从而进一步推动企业…

“五之链”第十六期沙龙活动在呆马科技成功举办

2024年4月19日&#xff0c;由临沂呆码区块链网络科技有限公司&#xff08;呆马科技&#xff09;承办的第十六期“五之链”物流主题沙龙活动成功举办。此次活动邀请了政府相关部门、知名科研院所、物流企业等20余家单位参与&#xff0c;共同探讨物流数据要素流通与智能应用的发展…

Redisson - 看门狗机制(Watch Dog)禁用方案

问题描述 Redis - Redisson tryLock 函数参数分析-CSDN博客 我们在这篇文章有提到过看门狗机制&#xff0c;其实有时候我们不想要看门狗机制的时候&#xff0c;如何禁用呢&#xff1f;&#xff01;因为有时候不想续期&#xff0c;需要实时性比较高的业务&#xff0c;但是看门…

使用prompt_toolkit构建交互式命令行工具

prompt_toolkit是一个python库&#xff0c;用于构建命令行工具和终端应用。其官网介绍如下&#xff0c; prompt_toolkit is a library for building powerful interactive command line and terminal applications in Python. 安装命令如下&#xff0c; pip install prompt_to…

STM32 DAP

STM32 DAP DAP&#xff08;Debug Access Port&#xff09;是一种调试访问端口&#xff0c;通常与调试接口一起使用&#xff0c;例如JTAG或SWD。DAP的作用是提供对目标设备内部的调试、测试和编程访问权限&#xff0c;允许开发人员通过调试工具与目标设备进行通信&#xff0c;并…