第6章 6.4 ASP.NET Core Web API各种技术及选择

6.4.1 控制器父类用哪个

6.2小节和6.3小节所演示的ASP.NET Core Web API 的控制器类都继承自ControllerBase,而6.1中MVC的控制器继承自Controller,Controller又继承自ControllerBase。

所以,一般情况下,编写的WebAPI控制器类继承自ControllerBase即可,当然也可以不继承任何类,例如:

6.4.2 操作方法的异步、返回值、状态码

1. 异步及返回值

IActionResult返回值:

添加一个Hello控制器并编写操作方法,并且在返回404异常码时添加异常原因

cs 复制代码
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel.Design.Serialization;

namespace WebApplicationTest.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class HelloController : ControllerBase
    {
        [HttpGet]
        public IActionResult GetOrder(int id)
        {
            if (id==1)
            {
                return Ok(100);
            }
            else if (id==2)
            {
                return Ok(200);
            }
            else
            {
                return NotFound("id错误");
            }
        }
    }
}

启动调试

异常:

由于IActionResult不包含返回值的类型信息,Swagger无法从操作方法中获取返回数据的类型信息,所以ASP.Net Core中提供了一个泛型ActionResult<T>

ActionResult<T>作为返回值,新增操作方法:

cs 复制代码
 [HttpGet("{id}")]
 public ActionResult<Person> GetOrderFX(int id)
 {
     if (id == 1)
     {
         return new Person("枸杞泡茶", 18);
     }
     else if (id == 2)
     {
         return new Person("牧羊人", 27);
     }
     else
     {
         return NotFound("id错误");
     }
 }

启动调试:

2. 异常响应码及统一响应体

一般在项目开发中,需要统一响应报文体的格式,以便客户端进行错误处理。例如此处声明一个ErrorInfo类表示错误详情:

cs 复制代码
namespace WebApplicationTest
{
    public record ErrorInfo(int ErrorCode ,string ?Message);
}

改造【GetOrderFX】方法:

cs 复制代码
 [HttpGet("{id}")]
 public ActionResult<Person> GetOrderFX(int id)
 {
     if (id<=0)
     {
         return BadRequest(new ErrorInfo(100, "id需为正数!"));
     }
     else if (id == 1)
     {
         return new Person("枸杞泡茶", 18);
     }
     else if (id == 2)
     {
         return new Person("牧羊人", 27);
     }
     else
     {
         return NotFound(new ErrorInfo(100,"人员不存在!"));
     }
 }

启动调试

6.4.3 操作方法的参数从哪里来

给服务端WebAPI传参时,有URL、QueryString,请求报文体,三种

1. 从URL获取

例如新增一个控制器

cs 复制代码
 [HttpGet("N1/{number1}/N2/{number2}")]
 public int  Add(int number1,int number2)
 {
     return number1+number2;
 }

启动调试

2. QueryString

对于通过QueryString传递的参数,使用 [FromQuery]获取值

编写一个控制方法:

cs 复制代码
[HttpPost]
public int AddQueryString([FromQuery]int number1, [FromQuery] int number2)
{
    return number1 + number2;
}

启动调试:

调试结果查看,默认的方式其实就是QueryString方式,如果需要显式设置:

cs 复制代码
 [HttpPost]
 public int AddQueryString([FromQuery]int number1, [FromQuery] int number2)
 {
     return number1 + number2;
 }
3. 请求报文体

新增一个操作

cs 复制代码
[HttpPost]
public string AddUser(Person ppp1)
{
    return "保存成功!"+ppp1.Name +",Age:"+ppp1 .Age;
}

启动调试

Json请求报文体

响应:

当然,这几种方式也可以混用:

cs 复制代码
[HttpPut("{Name}")]
public string AddUser1(string Name, Person ppp1)
{
    return "保存成功!" + ppp1.Name + ",Age:" + ppp1.Age+","+Name;
}

启动调试

响应

相关推荐
间彧21 分钟前
JWT Claims详解
后端
IT_陈寒2 小时前
JavaScript性能优化:7个90%开发者不知道的V8引擎黑科技
前端·人工智能·后端
摸鱼的春哥2 小时前
“全栈模式”必然导致“质量雪崩”!和个人水平关系不大
前端·javascript·后端
道传科技上位机2 小时前
C# 循环和条件用法大全(while dowhile for foreach if Switch try)全站最全
开发语言·c#
野犬寒鸦5 小时前
多级缓存架构:性能与数据一致性的平衡处理(原理及优势详解+项目实战)
java·服务器·redis·后端·缓存
yi碗汤园6 小时前
【一文了解】C#的StringSplitOptions枚举
开发语言·前端·c#
Tony Bai10 小时前
【Go开发者的数据库设计之道】05 落地篇:Go 语言四种数据访问方案深度对比
开发语言·数据库·后端·golang
eqwaak010 小时前
Flask实战指南:从基础到高阶的完整开发流程
开发语言·后端·python·学习·flask
笨蛋不要掉眼泪11 小时前
SpringBoot项目Excel成绩录入功能详解:从文件上传到数据入库的全流程解析
java·vue.js·spring boot·后端·spring·excel
Humbunklung11 小时前
C# 使用应用RSA和ECC进行数字签名和签名验证
开发语言·c#·rsa·ecc