您的位置:首页 > 娱乐 > 明星 > Web框架 --- 解析Web请求 [FromBody] [FromQuery] [FromRoute] [FromHeader]

Web框架 --- 解析Web请求 [FromBody] [FromQuery] [FromRoute] [FromHeader]

2024/10/5 20:24:07 来源:https://blog.csdn.net/weixin_38803409/article/details/141331185  浏览:    关键词:Web框架 --- 解析Web请求 [FromBody] [FromQuery] [FromRoute] [FromHeader]

Web框架 --- 解析Web请求 [FromBody] [FromQuery] [FromRoute] [FromHeader]

  • [FromBody]
  • [FromQuery]
  • [FromRoute] or [FromUri]
  • [FromHeader]

[FromBody]

  • FromBody 属性在使用 application/json 内容类型并在正文中传递 JSON 时使用
  • 通常情况下,FromBody 在一个操作中只能用传一个参数。因此,如果在 JSON 正文中传递了多个值,则需要将每个属性添加到一个类中,并将该类用作操作参数的类型.
  • 一般只有POST和PUT使用FromBody
// Customer.cs
public class Customer
{public string Forename { get; init; }public string Surname { get; init; }
}
  • 这个属性只有在控制器中没有使用 ApiController 属性时才需要使用
[Route("api/from-mvc")]
public class FromMvcController : Controller
{...[HttpPost("from-body")]public IActionResult FromBody([FromBody]string forename){return Ok(new { forename });}
}
  • 如果继承了ApiController可以直接写参数,不需要[FromBody]
// FromApiController.cs
[Route("api/from-api")]
public class FromApiController : ApiController
{...[HttpPost("from-body")]public IActionResult FromBody(Customer customer){return Ok(new { customer.Forename, customer.Surname });}
}

[FromQuery]

  • [FromQuery] 用于从uri中的query string (? 后面的部分) 取得参数. query string 可以有多个参数,用 & 符号进行分隔
 Uri: /api/from-api/from-query?name="test"&page=4
[Route("api/from-api")]
public class FromApiController : ApiController
{[HttpGet("from-query")]public IActionResult FromQuery([FromQuery] string name, [FromQuery] int page){return Ok(new { name, page });}...
}
  • [FromQuery] 可以是optional. 用 [Optional] attribute 或者给参数设置default value
[Route("api/from-api")]
public class FromApiController : ApiController
{[HttpGet("from-query")]public IActionResult FromQuery([Optional][FromQuery] string name){return Ok(new { name, page });}...
}
[Route("api/from-api")]
public class FromApiController : ApiController
{[HttpGet("from-query")]public IActionResult FromQuery([FromQuery] string name = string.Empty, [FromQuery] int page){return Ok(new { name, page });}...
}

[FromRoute] or [FromUri]

  • 从uri路径里拿参数, 两种定义方式如下:
  • [HttpGet, Route("from-route/{category}")]
  • [HttpGet("from-route/{category}")]
Uri: /api/from-api/from-route/blazor
// FromApiController.cs
[Route("api/from-api")]
public class FromApiController : ApiController
{//这里在路径中给对于位置的参数命名{category}[HttpGet("from-route/{category}")]public IActionResult FromRoute([FromRoute] string category){return Ok(new { category });}
}
Uri: /api/from-api/from-route-with-name/blazor
//传入时起一个别名"categoryName"
//[FromRoute(Name = "category")] string categoryName
[HttpGet("from-route-with-name/{category}")]
public IActionResult FromRouteWithName([FromRoute(Name = "category")] string categoryName)
{return Ok(new { categoryName });
}

[FromHeader]

  • 从http request中的header中提取信息 (header中有很多kv pair)
GET /data HTTP/1.1
Host: api.example.com
Authorization: Bearer your-access-token
Content-Type: application/json
Accept: application/json
User-Agent: MyApp/1.0
// FromApiController.cs
// Http request header: Authorization: Bearer abcd
[ApiController]
[Route("api/from-api")]
public class FromApiController : Controller
{[HttpGet("from-header")]public IActionResult FromHeader([FromHeader] string authorization){return Ok(new { authorization });}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com