.Net WebAPI(一)


文章目录

  • 项目地址
  • 一、WebAPI基础
    • 1. 项目初始化
      • 1.1 创建简单的API
        • 1.1.1 get请求
        • 1.1.2 post请求
        • 1.1.3 put请求
        • 1.1.4 Delete请求
      • 1.2 webapi的流程
    • 2.Controllers
      • 2.1 创建一个shirts的Controller
    • 3. Routing
      • 3.1 使用和创建MapControllers
      • 3.2 使用Routing的模板语言
    • 4. Mould Binding
      • 4.1 指定数据的来源
        • 4.1.1 给Request请求添加
          • 1. FromRoute
          • 2. FromQuery
          • 3. FromHeader
        • 4.1.2 给Post请求添加
          • 1. FromBody
          • 2. FromForm
    • 5. Mould Validation
      • 5.1 添加Model Validation
      • 5.2 添加自定义的Validation
    • 6. WebApi Return Types
      • 6.1 直接返回对象
      • 6.2 返回多类型
    • 7. Action filter
      • 7.1 创建filter


项目地址

  • 教程作者:
  • 教程地址:
  • 代码仓库地址:
  • 所用到的框架和插件:
webapi

一、WebAPI基础

1. 项目初始化

  1. 创建一个一个项目文件夹,并且在控制台输入
dotnew webapi -n Restaurants.API --noopenapi -controllers
  1. 但是此时的项目是没有sln文件的,创建sln文件,但是这时候打开vs显示的是空项目
dotnet new sln
  1. 将项目添加到vs里
 dotnet sln add ./Restaurants.API

1.1 创建简单的API

  • 在program.cs里使用routing中间件配置路由
1.1.1 get请求
  • 获取所有的shirts
app.MapGet("/shirts", () =>
{
    return "Reading all the shirts";
});
  • 根据ID获取一个
//2.get shirt by id 
app.MapGet("/shirts/{id}", (int id) =>
{
    return $"Reading shirt with ID: {id}";
});
1.1.2 post请求
app.MapPost("/shirts", () =>
{
    return "Creating a new shirt.";
});

1.1.3 put请求

更新

app.MapPut("/shirts/{id}", (int id) =>
{
    return $"Updating shirt with ID: {id}";
});
1.1.4 Delete请求

删除

app.MapDelete("/shirts/{id}", (int id) =>
{
    return $"Deleting shirt with ID: {id}";
});

1.2 webapi的流程

在这里插入图片描述

2.Controllers

2.1 创建一个shirts的Controller

  • 创建Controllers文件夹,在该文件夹下创建ShirtsController.cs文件
using Microsoft.AspNetCore.Mvc;

namespace WebAPIDemo.Controllers
{
    [ApiController]
    public class ShirtsController : ControllerBase
    {
        public string GetShirts()
        {
            return "Reading all the shirts";   
        }

        public string GetShirtById(int id)
        {
            return $"Reading shirt with ID: {id}";
        }

        public string CreateShirt()
        {
            return "Creating a new shirt.";
        }

        public string UpdateShirt() {
            return "Updating shirt with ID: {id}";
        }

        public string DeleteShirt(int id)
        {
            return $"Deleting shirt with ID: {id}";
        }

    }
}

3. Routing

3.1 使用和创建MapControllers

  1. Program.cs里添加rout的中间件

在这里插入图片描述

  1. 在Controller里,直接使用特性标记routing
using Microsoft.AspNetCore.Mvc;

namespace WebAPIDemo.Controllers
{
    [ApiController]
    public class ShirtsController : ControllerBase
    {
        [HttpGet("/shirts")]
        public string GetShirts()
        {
            return "Reading all the shirts";   
        }

        [HttpGet("/shirts/{id}")]
        public string GetShirtById(int id)
        {
            return $"Reading shirt with ID: {id}";
        }

        [HttpPost("/shirts")]
        public string CreateShirt()
        {
            return "Creating a new shirt.";
        }

        [HttpPut("/shirts/{id}")]
        public string UpdateShirt() {
            return "Updating shirt with ID: {id}";
        }

        [HttpDelete("/shirts/{id}")]
        public string DeleteShirt(int id)
        {
            return $"Deleting shirt with ID: {id}";
        }
    }
}

3.2 使用Routing的模板语言

  1. 在上面我们给每个Controller都使用一个路由,这样代码冗余,我们可以使用模板来指定rout;

在这里插入图片描述

  • 这样我们可以直接用过https://localhost:7232/shirts 进行访问shirts就是控制器的名称
  1. 如果我们想通过https://localhost:7232/api/shirts进行访问的话,修改模板routing

在这里插入图片描述

4. Mould Binding

将Http request和 Controller里的 parameter绑定起来
在这里插入图片描述

4.1 指定数据的来源

4.1.1 给Request请求添加
1. FromRoute
  • 指定这个参数必须是从https://localhost:7232/api/shirts/2/red从路由里来,如果不是,则报错
[HttpGet("{id}/{color}")]
public string GetShirtById(int id,[FromRoute]string color)
{
    return $"Reading shirt with ID: {id},color is {color}";
}
2. FromQuery
  • 必须通过QueryString的形式提供:https://localhost:7232/api/shirts/2?color=red
 [HttpGet("{id}/{color}")]
 public string GetShirtById(int id,[FromQuery]string color)
 {
     return $"Reading shirt with ID: {id},color is {color}";
 }
3. FromHeader
  • 必须通过请求头来传递,且Key是Name
[HttpGet("{id}/{color}")]
public string GetShirtById(int id,[FromHeader(Name="color")]string color)
{
    return $"Reading shirt with ID: {id},color is {color}";
}

在这里插入图片描述

4.1.2 给Post请求添加
  • 在webapp里创建一个新的文件夹Models,并且添加一个Shirts,cs
namespace WebAPIDemo.Models
{
    public class Shirt
    {
        public int ShirtId { get; set; }
        public string? Brand { get; set; }   
        public string? Color { get; set; }
        public int Size { get; set; }
        public string? Gender { get; set; }
        public double Price { get; set; }
    }
}
1. FromBody
  • 从请求体里来
[HttpPost]
public string CreateShirt([FromBody]Shirt shirt)
{
    return "Creating a new shirt.";
}

在这里插入图片描述

2. FromForm
  • 通过表格形式传递
[HttpPost]
public string CreateShirt([FromForm]Shirt shirt)
{
    return "Creating a new shirt.";
}

在这里插入图片描述

5. Mould Validation

5.1 添加Model Validation

  • Models/Shirts.cs类里添加验证,如果没有给出必须的参数,请求会报错400
using System.ComponentModel.DataAnnotations;

namespace WebAPIDemo.Models
{
    public class Shirt
    {
        [Required]
        public int ShirtId { get; set; }
        [Required]
        public string? Brand { get; set; }   
        public string? Color { get; set; }
        public int Size { get; set; }
        [Required]
        public string? Gender { get; set; }
        public double Price { get; set; }
    }
}

5.2 添加自定义的Validation

  1. Models文件夹里,添加Validations文件夹,并且添加文件Shirt_EnsureCorrectSizingAttribute.cs
using System.ComponentModel.DataAnnotations;
using WebAPIDemo.Models;

namespace WebApp.Models.Validations
{
    public class Shirt_EnsureCorrectSizingAttribute : ValidationAttribute
    {
        protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
        {
            var shirt = validationContext.ObjectInstance as Shirt;

            if (shirt != null && !string.IsNullOrWhiteSpace(shirt.Gender))
            {
                if (shirt.Gender.Equals("men", StringComparison.OrdinalIgnoreCase) && shirt.Size < 8)
                {
                    return new ValidationResult("For men's shirts, the size has to be greater or equal to 8.");
                }
                else if (shirt.Gender.Equals("women", StringComparison.OrdinalIgnoreCase) && shirt.Size < 6)
                {
                    return new ValidationResult("For women's shirts, the size has to be greater or equal to 6.");
                }
            }

            return ValidationResult.Success;
        }
    }
}
  1. 我们验证的是Size,所以在Model里的Size添加我们自定义的Attribute
[Shirt_EnsureCorrectSizing]
public int Size { get; set; }

6. WebApi Return Types

6.1 直接返回对象

  • 创建一个List,存放所有的Shirt实例,返回一个Shirt类型
    在这里插入图片描述
  • 通过id访问https://localhost:7232/api/shirts/1, 返回一个json
{
	shirtId: 1,
	brand: "My Brand",
	color: "Blue",
	size: 10,
	gender: "Men",
	price: 30
}

6.2 返回多类型

  • 如果返回多类型,就不能指定具体返回的类型,需要返回一个IActionResult
[HttpGet("{id}")]
public IActionResult GetShirtById(int id)
{
    if (id <= 0)
    {
        return BadRequest("Invalid shirt ID");
    }
    var shirt = shirts.FirstOrDefault(x => x.ShirtId == id);
    if( shirt == null)
    {
        return NotFound();
    }

    return Ok(shirt);
}

7. Action filter

  • 使用Action filter进行data validation

7.1 创建filter

  1. 创建Filters文件夹,并且创建Shirt_ValidateShirtId.cs类,并且添加对ShortId的验证
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using WebAPIDemo.Models.Repositories;


namespace WebAPIDemo.Filters
{
    public class Shirt_ValidateShirtIdFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            base.OnActionExecuting(context);
            var shirtId = context.ActionArguments["id"] as int?;
            if (shirtId.HasValue)
            {
                if (shirtId.Value <= 0)
                {
                    context.ModelState.AddModelError("ShirtId", "ShirtId is invalid.");
                    var problemDetails = new ValidationProblemDetails(context.ModelState)
                    {
                        Status = StatusCodes.Status400BadRequest
                    };
                    context.Result = new BadRequestObjectResult(problemDetails);
                }
                else if (!ShirtRepository.ShirtExists(shirtId.Value))
                {
                    context.ModelState.AddModelError("ShirtId", "Shirt doesn't exist.");
                    var problemDetails = new ValidationProblemDetails(context.ModelState)
                    {
                        Status = StatusCodes.Status404NotFound
                    };
                    context.Result = new NotFoundObjectResult(problemDetails);
                }
            }
        }
    }
}
  1. 使用添加的filter,对 id进行验证
[HttpGet("{id}")]
[Shirt_ValidateShirtIdFilter]
public IActionResult GetShirtById(int id)
{
    return Ok(ShirtRepository.GetShirtById(id));
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL在线格式化 - 加菲工具

SQL在线格式化 打开网站 加菲工具 选择“SQL 在线格式化” 或者直接访问 https://www.orcc.online/tools/sql 输入sql&#xff0c;点击上方的格式化按钮即可 输入框得到格式化后的sql结果

vs 调试

常用&#xff1a; 调试->窗口-> 断点 监视 自动窗口 局部变量 调用堆栈 内存 反汇编&#xff08;也可以右键&#xff0c;转到反汇编&#xff09; 寄存器 快捷键&#xff1a; F5:启用调试&#xff0c;经常用来跳到下一个断点处 F9创建断点和取消断点。断点的重要作用&…

25. 深浅拷贝

一、什么是浅拷贝 只对对象的最顶层进行的拷贝称为 浅拷贝。我们可以用 copy 模块中的 copy() 方法实现浅拷贝。 import copya [11, 22, 33] b [44, 55, 66] c [a, b] d copy.copy(c)print(f"c: {c}") print(f"d: {d}") print(f"c d: {c d}&q…

docker简单命令

docker images 查看镜像文件 docker ps -a 查看容器文件 docker rm 0b2 删除容器文件&#xff0c;id取前三位即可 docker rmi e64 删除镜像文件&#xff08;先删容器才能删镜像&#xff09;&#xff0c;id取前三位即可 在包含Dockerfile文件的目录…

【Java】4、虚拟机 JVM

目录 Java内存区域详解(重点) JVM垃圾回收详解(重点) 类文件结构详解 类加载过程详解 类加载器详解(重点) 最重要的JVM参数总结 JDK监控和故障处理工具总结 JVM线上问题排查和性能调优案例 参考&#xff1a; JVM 核心技术 32 讲 深入浅出 Java 虚拟机

谷歌浏览器的无障碍功能介绍

在数字化时代&#xff0c;互联网已经成为人们生活中不可或缺的一部分。然而&#xff0c;并不是所有人都能平等地享受网络带来的便利。为了帮助有特殊需求的人士更好地访问和使用网络内容&#xff0c;谷歌浏览器推出了一系列无障碍功能。这些功能旨在提升视力障碍、听力障碍及其…

3D 生成重建035-DiffRF直接生成nerf

3D 生成重建035-DiffRF直接生成nerf 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 本文提出了一种基于渲染引导的三维辐射场扩散新方法DiffRF&#xff0c;用于高质量的三维辐射场合成。现有的方法通常难以生成具有细致纹理和几何细节的三维模型&#xff0c;并且容易出…

从斯柯达和大众汽车安全漏洞事件剖析谈软件安全设计

一、事件概述 2022年&#xff0c;斯柯达和大众汽车被曝出存在一系列安全漏洞&#xff0c;这一事件引起了广泛关注。据估算&#xff0c;这些漏洞可能涉及超过 140 万辆汽车&#xff0c;涵盖斯柯达速派 III&#xff08;Skoda Superb III&#xff09;、斯柯达柯珞克&#xff08;S…

Hyperledger Fabric 2.x 环境搭建

Hyperledger Fabric 是一个开源的企业级许可分布式账本技术&#xff08;Distributed Ledger Technology&#xff0c;DLT&#xff09;平台&#xff0c;专为在企业环境中使用而设计&#xff0c;与其他流行的分布式账本或区块链平台相比&#xff0c;它有一些主要的区别。 环境准备…

OpenIPC开源FPV之Adaptive-Link天空端代码解析

OpenIPC开源FPV之Adaptive-Link天空端代码解析 1. 源由2. 框架代码3. 报文处理3.1 special报文3.2 普通报文 4. 工作流程4.1 Profile 竞选4.2 Profile 研判4.3 Profile 应用 5. 总结6. 参考资料7. 补充资料7.1 RSSI 和 SNR 的物理含义7.2 信号质量加权的理论依据7.3 实际应用中…

metinfo的csrf漏洞复现

http://localhost/metinfo/install/index.php 管理员admin登录 抓修改信息包 进入点击受害链接 localhost/333.html 管理员被修改密码原来root错误被强制退出 输入密码123456登录正常

jclasslib Bytecode Viewer 安装

IDEA 2023.1.3 Settings->Plugins->Marketplace&#xff0c;搜索jclasslib Bytecode Viewer, install,apply 选中你所要分析的类&#xff0c;view->show bytecode with jclasslib gaoding

智能高效的IDE GoLand v2024.3全新发布——支持最新Go语言

GoLand 使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…

Android学习路线图

‌Android系统的开发始于2003年&#xff0c;最初由安迪鲁宾在危险公司&#xff08;Danger, Inc.&#xff09;开发。2005年&#xff0c;Google收购了危险公司&#xff0c;并将其移动开发团队纳入旗下。2007年&#xff0c;Google正式发布了Android的第一个版本&#xff0c;并随后…

【含开题报告+文档+PPT+源码】基于微信小程序的旅游论坛系统的设计与实现

开题报告 近年来&#xff0c;随着互联网技术的迅猛发展&#xff0c;人们的生活方式、消费习惯以及信息交流方式都发生了深刻的变化。旅游业作为国民经济的重要组成部分&#xff0c;其信息化、网络化的发展趋势也日益明显。旅游论坛作为旅游信息交流和分享的重要平台&#xff0…

CTFshow-php特性(Web89-115)

CTFshow-php特性(Web89-115) Web89&#xff08;intval&#xff09; <?php include("flag.php"); highlight_file(__FILE__);if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("no no no!");}if(intval($num))…

ip地址获取失败啥意思?ip地址获取失败怎么回事

在日常的网络使用中&#xff0c;我们时常依赖于稳定的IP地址来确保数据的顺畅传输和设备的正常识别。然而&#xff0c;有时我们会遇到“IP地址获取失败”的困扰&#xff0c;这不仅阻碍了我们的网络访问&#xff0c;还可能带来一系列的网络连接问题。那么&#xff0c;IP地址获取…

中国计算机学会计算机视觉专委会携手合合信息举办企业交流活动,为AI安全治理打开“新思路”

近期&#xff0c;《咬文嚼字》杂志发布了2024年度十大流行语&#xff0c;“智能向善”位列其中&#xff0c;过去一年时间里&#xff0c;深度伪造、AI诈骗等话题屡次登上热搜&#xff0c;AI技术“野蛮生长”引发公众担忧。今年9月&#xff0c;全国网络安全标准化技术委员会发布了…

RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGB

RK3588 ,基于FFmpeg, 拉取RTSP,使用 mpp 实现硬解码. ⚡️ 参考: Rk3588 FFmpeg 拉流 RTSP, mpp 硬解码转RGBUbuntu x64 架构, 交叉编译aarch64 FFmpeg mppCode RTSPint open_stream(

ubuntu监测硬盘状态

安装smartmontools smartctl -l error /dev/sdk smartctl -i /dev/sda lshw -class disk smartctl -H /dev/sd 结果1&#xff1a; 结果2&#xff1a;PASSED&#xff0c;这表示硬盘健康状态良好 smartctl -a /dev/sdb sdk lsblk blkid 测试写入速度 time dd if/dev/zero of…