<C#>.NET WebAPI 的 FromBody ,FromForm ,FromServices等详细解释

在 .NET 8 Web API 中,[FromBody][FromForm][FromHeader][FromKeyedServices][FromQuery][FromRoute][FromServices] 这些都是用于绑定控制器动作方法参数的特性,下面为你详细解释这些特性。

1. [FromBody]

  • 作用:从 HTTP 请求的消息体中绑定参数。一般用于处理 JSON 或 XML 格式的数据,常用于 POST、PUT 等请求。
  • 示例
csharp 复制代码
[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
    [HttpPost]
    public IActionResult CreateUser([FromBody] User user)
    {
        // 处理接收到的用户对象
        return Ok(user);
    }
}

public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}
  • 请求示例
json 复制代码
{
    "Name": "John Doe",
    "Age": 30
}

2. [FromForm]

  • 作用 :从 HTTP 请求的表单数据中绑定参数。通常用于处理 application/x-www-form-urlencodedmultipart/form-data 格式的表单数据。
  • 示例
csharp 复制代码
[ApiController]
[Route("[controller]")]
public class FormController : ControllerBase
{
    [HttpPost]
    public IActionResult SubmitForm([FromForm] string name, [FromForm] int age)
    {
        return Ok($"Name: {name}, Age: {age}");
    }
}
  • 请求示例(使用 HTML 表单)
html 复制代码
<form action="/Form" method="post">
    <input type="text" name="name" />
    <input type="number" name="age" />
    <input type="submit" value="Submit" />
</form>

3. [FromHeader]

  • 作用 :从 HTTP 请求的头部中绑定参数。当需要从请求头中获取特定信息时使用,比如 Authorization 头。
  • 示例
csharp 复制代码
[ApiController]
[Route("[controller]")]
public class HeaderController : ControllerBase
{
    [HttpGet]
    public IActionResult GetData([FromHeader(Name = "X-Custom-Header")] string customHeader)
    {
        return Ok($"Custom Header Value: {customHeader}");
    }
}
  • 请求示例(使用 Postman 或类似工具设置请求头)

    X-Custom-Header: SomeValue

4. [FromKeyedServices]

  • 作用:从依赖注入容器中获取具有特定键的服务实例并绑定到参数。在使用键控服务时,可通过此特性按键获取服务。
  • 示例
csharp 复制代码
// 注册键控服务
services.AddKeyedSingleton<IMyService, MyService>("key1");

[ApiController]
[Route("[controller]")]
public class KeyedServiceController : ControllerBase
{
    [HttpGet]
    public IActionResult GetData([FromKeyedServices("key1")] IMyService service)
    {
        return Ok(service.GetData());
    }
}

public interface IMyService
{
    string GetData();
}

public class MyService : IMyService
{
    public string GetData()
    {
        return "Some data";
    }
}

5. [FromQuery]

  • 作用:从 HTTP 请求的查询字符串中绑定参数。常用于 GET 请求,参数会附加在 URL 后面。
  • 示例
csharp 复制代码
[ApiController]
[Route("[controller]")]
public class QueryController : ControllerBase
{
    [HttpGet]
    public IActionResult GetData([FromQuery] string name, [FromQuery] int age)
    {
        return Ok($"Name: {name}, Age: {age}");
    }
}
  • 请求示例

    /Query?name=John&age=30

6. [FromRoute]

  • 作用:从路由模板中绑定参数。路由模板定义了 URL 的结构,参数会嵌入到 URL 路径中。
  • 示例
csharp 复制代码
[ApiController]
[Route("api/[controller]/{id}")]
public class RouteController : ControllerBase
{
    [HttpGet]
    public IActionResult GetData([FromRoute] int id)
    {
        return Ok($"ID: {id}");
    }
}
  • 请求示例

    /api/Route/123

7. [FromServices]

  • 作用:从依赖注入容器中获取服务实例并绑定到参数。当控制器动作方法需要使用某个服务时,可通过此特性注入该服务。
  • 示例
csharp 复制代码
// 注册服务
services.AddScoped<IMyService, MyService>();

[ApiController]
[Route("[controller]")]
public class ServiceController : ControllerBase
{
    [HttpGet]
    public IActionResult GetData([FromServices] IMyService service)
    {
        return Ok(service.GetData());
    }
}

public interface IMyService
{
    string GetData();
}

public class MyService : IMyService
{
    public string GetData()
    {
        return "Some data";
    }
}

这些特性可以帮助开发者更灵活地处理不同来源的数据,提高代码的可读性和可维护性。

相关推荐
IvanCodes2 小时前
Python 数据处理(十三):JSON、CSV 与数据序列化
开发语言·python
aramae4 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
淡海水5 小时前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
asdzx676 小时前
如何使用 C# 提取 PPT 文本与图片
c#·ppt·提取文本
qq_2518364576 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
郑州光合科技余经理7 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
知识分享小能手7 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
+VX:Fegn08958 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计
阿里嘎多学长8 小时前
2026-09-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
weixin_3077791310 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab