添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

ASP.NET Core的Web API在调用过程中,经常涉及到Client端参数传递和Server端参数的接收的问题。其中参数主要包括URL参数,表单参数和路由参数等,如何处理好各种类型的参数传递,尤其是复杂类型参数的处理,是正确调用Web API的关键也是难点。

本文通过介绍FromQueryAttribute,FromRouteAttribute和FromBodyAttribute三个Attribute,来介绍如果在URL,表单和路由中传递对复杂的对象参数。

FromQueryAttribute: 通过调用WebAPI的URL参数绑定Action参数数据。
FromRouteAttribute: 通过调用WebAPI的URL的路由参数绑定Action参数数据。
FromBodyAttribute:通过Web请求中的body段数据绑定Action参数数据,一个Action方法,只能使用一次FromBodyAttribute属性。

我们通过一个获取足球明星信息的Web API来验证上述定义,包含单一的参数使用模式和混合参数的使用模式。

具体Player类代码如下,Web API完整代码请参考附录。

public class Player
    public int Id { get; set; }
    public string Name { get; set; }
    public int Number { get; set; }

FromQueryAttribute

Server直接通过URL参数实例化对象。

[HttpGet]
[Route(nameof(playerGetByURL))]
public Player playerGetByURL([FromQuery]Player player)
   return player;
  1. Action方法playerGetByURL中包含一个Player类型的参数,包含Id,Name和出场号码。
  2. URL https://localhost:5001/players/playerGetByURL?id=1&name=Zidane&number=5在PostMan中调用。
    在这里插入图片描述
  3. URL中的参数被Server直接实例化成了Player对象。

FromRouteAttribute

Server直接通过路由参数实例化对象。

[HttpGet]
[Route(nameof(playerGetByRoute) + "/{id}/{name}/{number}")]
public Player playerGetByRoute([FromRoute] Player player)
   return player;
  1. Action方法playerGetByRoute中包含一个Player类型的参数,包含Id,Name和出场号码。
  2. URL https://localhost:5001/players/playerGetByRoute/1/Inzaghi/9在PostMan中调用。
    在这里插入图片描述
  3. 路由中的参数被Server直接实例化成了Player对象。

FromBodyAttribute

Server直接通过请求的body段数据创建Player对象。

[HttpPost(nameof(playerGetByBody))]
public Player playerGetByBody([FromBody]Player player)
   return player;
  1. Action方法playerGetByBody中包含一个Player类型的参数,包含Id,Name和出场号码。
  2. URL https://localhost:5001/players/playerGetByBody在PostMan中调用。Body段的JSON数据为:
    {
    “id”: 12,
    “name”: “Sheva”,
    “number”: 7
    }

在这里插入图片描述
3. Body内容被Server直接实例化成了Player对象。

FromQueryAttribute + FromBodyAttribute

Server直接通过请求的body段数据和URL参数创建两个Player对象

 [HttpPost(nameof(playerGetByBodyURL))]
 public IEnumerable<Player> playerGetByBodyURL([FromBody]Player player1, [FromQuery]Player player2)
     return new List<Player>(){
         player1,player2
  1. Action方法playerGetByBodyURL中包含两个Player类型的参数,一个来自请求的Body段,另一个来自URL参数。
  2. URL https://localhost:5001/players/playerGetByBodyURL?id=1&name=Zidane&number=5 在PostMan中调用。Body段的JSON数据为:
    {
    “id”: 12,
    “name”: “Sheva”,
    “number”: 7
    }
    在这里插入图片描述
  3. Body内容和URL中的参数被Server直接实例化成了Player对象。

FromQueryAttribute + FromRouteAttribute

Server直接通过路由和URL参数创建两个Player对象

  [HttpGet(nameof(playerGetByURLRoute) +  "/{id}/{name}/{number}")]
public IEnumerable<Player> playerGetByURLRoute([FromQuery]Player player1,  [FromRoute]Player player2)
           return new List<Player>(){
               player1,player2
  1. Action方法playerGetByURLRoute中包含两个Player类型的参数,一个来自URL参数,另一个来自路由参数。
  2. URL https://localhost:5001/players/playerGetByURLRoute/1/Inzaghi/9?id=1&name=Zidane&number=5在PostMan中调用。

FromRouteAttribute+ FromBodyAttribute

Server直接通过Request的body段数据和路由参数创建两个Player对象

[HttpPost(nameof(playerGetByBodyRoute) + "/{id}/{name}/{number}")]
public IEnumerable<Player> playerGetByBodyRoute([FromBody]Player player1, [FromRoute]Player player2)
   return new List<Player>(){
       player1,player2
  1. Action方法playerGetByBodyRoute中包含两个Player类型的参数,一个来自请求的Body段,另一个来自URL参数。
  2. URL https://localhost:5001/players/playerGetByBodyRoute/1/Inzaghi/9 在PostMan中调用。Body段的JSON数据为:
    {
    “id”: 12,
    “name”: “Sheva”,
    “number”: 7
    }
    在这里插入图片描述
  3. Body内容和路由中的参数被Server直接实例化成了Player对象。

FromRouteAttribute+ FromBodyAttribute + FromQueryAttribute

Server直接通过Web请求的body段数据,路由参数和URL参数创建三个Player对象

 [HttpPost(nameof(playerGetByBodyRouteURL) + "/{id}/{name}/{number}")]
public IEnumerable<Player> playerGetByBodyRouteURL([FromBody]Player player1, [FromRoute]Player player2, [FromQuery]Player player3)
    return new List<Player>(){
        player1, player2, player3
  1. Action方法playerGetByBodyRouteURL中包含三个Player类型的参数,一个来自请求的Body段,一个来自路由参数,一个来自URL参数。
  2. URL https://localhost:5001/players/playerGetByBodyRouteURL/1/Inzaghi/9?id=1&name=Zidane&number=5,在PostMan中调用。 Body段的JSON数据为:
    {
    “id”: 12,
    “name”: “Sheva”,
    “number”: 7
    }

FromQueryAttribute,FromRouteAttribute和FromBodyAttribute让Action中参数绑定的方式变得非常清晰。建议大家在开发中,采用这种显示指定的方式来处理代码,这样会让代码更便于管理。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using football.Models;
namespace football.Controllers
    [ApiController]
    [Route("[controller]")]
    public class PlayersController : ControllerBase
        private readonly ILogger<PlayersController> _logger;
        public PlayersController(ILogger<PlayersController> logger)
            _logger = logger;
        [HttpGet]
        [Route(nameof(playerGetByURL))]
        public Player playerGetByURL([FromQuery]Player player)
           return player;
        [HttpGet]
        [Route(nameof(playerGetByRoute) + "/{id}/{name}/{number}")]
        public Player playerGetByRoute([FromRoute] Player player)
           return player;
        [HttpPost(nameof(playerGetByBody))]
        public Player playerGetByBody([FromBody]Player player)
           return player;
        [HttpPost(nameof(playerGetByBodyURL))]
        public IEnumerable<Player> playerGetByBodyURL([FromBody]Player player1, [FromQuery]Player player2)
           return new List<Player>(){
               player1,player2
        [HttpPost(nameof(playerGetByBodyRoute) + "/{id}/{name}/{number}")]
        public IEnumerable<Player> playerGetByBodyRoute([FromBody]Player player1, [FromRoute]Player player2)
           return new List<Player>(){
               player1,player2
        [HttpGet(nameof(playerGetByURLRoute) +  "/{id}/{name}/{number}")]
        public IEnumerable<Player> playerGetByURLRoute([FromQuery]Player player1,  [FromRoute]Player player2)
           return new List<Player>(){
               player1,player2
        [HttpPost(nameof(playerGetByBodyRouteURL) + "/{id}/{name}/{number}")]
        public IEnumerable<Player> playerGetByBodyRouteURL([FromBody]Player player1, [FromRoute]Player player2, [FromQuery]Player player3)
           return new List<Player>(){
               player1, player2, player3
                    概要ASP.NET Core的Web API在调用过程中,经常涉及到Client端参数传递和Server端参数的接收的问题。其中参数主要包括URL参数,表单参数和路由参数等,如何处理好各种类型的参数传递,尤其是复杂类型参数的处理,是正确调用Web API的关键也是难点。本文通过介绍FromQueryAttribute,FromRouteAttribute和FromBodyAttribute三个Attribute,来介绍如果在URL,表单和路由中传递对复杂的对象参数。定义FromQueryAttrib
				
这两天看了CAP的源码,感觉自己和大神的差距实在太大,看源码学到的东西也很多,再也不用每天都是3层架构,一层一层的往下调用。 先说下我看到的只是一点点的CAP的源码,就看了订阅这块,.net core 使用services.AddHostedService<DefaultBootstrapper>, AddHostedService是.net core 的一个后台进程,它会一直来把...
.NetCore3.1——自定义过滤器ActionFilterAttribute 在我们做项目开发的时候很多时候需要自己定义过滤器,来进行一些特殊的处理,最常见的就是验证Token什么的,判断你这一次的请求是否合法。还有很多的用法就看项目的实际情况去自定义策略了。下面我介绍一下我做的自定义策略。 首先添加一个MyAuthorizeFilter类库,继承ActionFilterA...
asp.net core webapi 怎么接收Josn呀并转化为实体 现在可以把JSON当一个参数比如 data = "JSON" 这样接收后序列化,有没有之前的接收自动转化的方法 异步方式:
特性Attribute 特性:是用于在运行时传递程序各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。 特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。
SQLSugar是一种ORM(对象关系映射)工具,可以帮助我们更轻松地操作数据库。下面是在ASP.NET Core MVC使用SQLSugar进行多表查询的步骤: 1. 安装SQLSugar包 使用NuGet包管理器或通过命令行安装SQLSugar包。 2. 配置连接字符串 在appsettings.json文件配置数据库连接字符串,例如: "ConnectionStrings": { "DefaultConnection": "Server=localhost;Database=databaseName;User Id=userId;Password=password;" 3. 配置SQLSugar实例 在Startup.cs文件的ConfigureServices方法添加以下代码来配置SQLSugar实例: services.AddScoped<ISqlSugarClient>(provider => var connectionString = Configuration.GetConnectionString("DefaultConnection"); var db = new SqlSugarClient(new ConnectionConfig ConnectionString = connectionString, DbType = DbType.MySql, IsAutoCloseConnection = true, InitKeyType = InitKeyType.Attribute db.Aop.OnLogExecuting = (sql, pars) => Console.WriteLine($"{sql} {string.Join(",", pars.Select(p => $"{p.ParameterName}={p.Value}"))}"); return db; 这里使用了MySQL数据库,如果你使用的是其他类型的数据库,请根据需要进行修改。 4. 创建实体类 在Models文件夹下创建对应的实体类,例如: public class Order public int Id { get; set; } public int CustomerId { get; set; } public decimal TotalAmount { get; set; } public DateTime OrderDate { get; set; } public class Customer public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } 5. 进行多表查询 在Controller使用SQLSugar实例进行多表查询,例如: public class OrderController : Controller private readonly ISqlSugarClient _db; public OrderController(ISqlSugarClient db) _db = db; public IActionResult Index() var orders = _db.Queryable<Order, Customer>((o, c) => o.CustomerId == c.Id) .Select((o, c) => new o.Id, c.Name, o.TotalAmount, o.OrderDate .ToList(); return View(orders); 这里的多表查询是在Order表和Customer表之间进行的,通过CustomerId和Id进行关联。查询返回的结果是一个匿名类型,包含了订单的Id、客户的姓名、订单的总金额、订单的日期等信息。最后,将查询结果传递给View进行显示。 以上就是使用SQLSugar在ASP.NET Core MVC进行多表查询的基本步骤。