HTTP POST-ing JSON 数据和查询字符串值到 dotNet 核心 3.0 中的网络 API

HTTP POST-ing both JSON data, and query string values to a web API in dotNet core 3.0

背景:

我正在尝试使用 dotNet 核心 3.0 实现网络 API,以便它可以接受 JSON 数据的 POST-ed 负载。

我已经做到了这一点,但还有一个额外的复杂性:发布 JSON 数据的系统通过出现在查询字符串中的 API 密钥提供身份验证。 (实际上 - 它提供了 3 个查询字符串值:api 键、一个时间戳和一个 MAC 散列,基于前两个值的共享秘密。)

(我宁愿它作为 X-Api-Key 值出现在 HTTP header 中,因为我之前已经通过此方法实现了安全性 - 但我别无选择)

JSON数据实际上是objects相同类型的列表,所以控制器方法上的绑定是这样的:

    [HttpPost]
    [ProducesResponseType(StatusCodes.Status201Created)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [ProducesResponseType(StatusCodes.Status401Unauthorized)]
    [ProducesResponseType(StatusCodes.Status500InternalServerError)]
    public IActionResult AddMyStuffBatches(List<MyStuffBatch> batches) 

查询字符串中出现的身份验证值实际上与模型无关——它们与进程上传的数据无关。因此,它们不应出现在 batches 列表中或作为 MyStuffBatch.

的特定实例的 属性

所以问题是: 我如何设计一个控制器来处理在查询字符串上传递的身份验证 API 关键细节,同时(假设一个有效的 API 密钥等已通过)仍在像以前一样处理 JSON 有效负载?

您可以在 post 操作上使用 [FromQuery] 来绑定查询字符串中的参数,例如:

Url:

POST https://localhost:5001/weatherforecast?timestamp=2019-11-06T09:27:36.000Z&apiKey=secretkey

操作:

[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public IActionResult AddMyStuffBatches(List<MyStuffBatch> batches,[FromQuery] string timestamp, [FromQuery] string apiKey)