在 .NET 8 Web API 中,[FromBody]
、[FromForm]
、[FromHeader]
、[FromKeyedServices]
、[FromQuery]
、[FromRoute]
和 [FromServices]
這些都是用于綁定控制器動作方法參數的特性,下面為你詳細解釋這些特性。
1. [FromBody]
- 作用:從 HTTP 請求的消息體中綁定參數。一般用于處理 JSON 或 XML 格式的數據,常用于 POST、PUT 等請求。
- 示例:
[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; }
}
- 請求示例:
{"Name": "John Doe","Age": 30
}
2. [FromForm]
- 作用:從 HTTP 請求的表單數據中綁定參數。通常用于處理
application/x-www-form-urlencoded
或multipart/form-data
格式的表單數據。 - 示例:
[ApiController]
[Route("[controller]")]
public class FormController : ControllerBase
{[HttpPost]public IActionResult SubmitForm([FromForm] string name, [FromForm] int age){return Ok($"Name: {name}, Age: {age}");}
}
- 請求示例(使用 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
頭。 - 示例:
[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]
- 作用:從依賴注入容器中獲取具有特定鍵的服務實例并綁定到參數。在使用鍵控服務時,可通過此特性按鍵獲取服務。
- 示例:
// 注冊鍵控服務
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 后面。
- 示例:
[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 路徑中。
- 示例:
[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]
- 作用:從依賴注入容器中獲取服務實例并綁定到參數。當控制器動作方法需要使用某個服務時,可通過此特性注入該服務。
- 示例:
// 注冊服務
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";}
}
這些特性可以幫助開發者更靈活地處理不同來源的數據,提高代碼的可讀性和可維護性。