Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HTTP将JSON数据和查询字符串值发布到dotNet core 3.0中的web API_Json_Asp.net Core Webapi_Model Binding - Fatal编程技术网

HTTP将JSON数据和查询字符串值发布到dotNet core 3.0中的web API

HTTP将JSON数据和查询字符串值发布到dotNet core 3.0中的web API,json,asp.net-core-webapi,model-binding,Json,Asp.net Core Webapi,Model Binding,背景: 我正在尝试使用dotNet core 3.0实现一个web API,以便它能够接受JSON数据的POST-ed有效负载 我已经做到了这一点,但还有一个额外的复杂性:发布JSON数据的系统通过出现在查询字符串上的API密钥提供身份验证。(实际上,它提供了3个查询字符串值:前两个值的api密钥、时间戳和基于共享密钥的MAC哈希。) (我宁愿它作为X-Api-Key值出现在HTTP头中,因为我以前已经通过这个方法实现了安全性——但我没有选择) JSON数据实际上是相同类型的对象列表,因此控制器

背景:

我正在尝试使用dotNet core 3.0实现一个web API,以便它能够接受JSON数据的POST-ed有效负载

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

(我宁愿它作为X-Api-Key值出现在HTTP头中,因为我以前已经通过这个方法实现了安全性——但我没有选择)

JSON数据实际上是相同类型的对象列表,因此控制器方法上的绑定如下所示:

    [HttpPost]
    [ProducesResponseType(StatusCodes.Status201Created)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [ProducesResponseType(StatusCodes.Status401Unauthorized)]
    [ProducesResponseType(StatusCodes.Status500InternalServerError)]
    public IActionResult AddMyStuffBatches(List<MyStuffBatch> batches) 
[HttpPost]
[产品响应类型(StatusCodes.Status201Created)]
[产品响应类型(StatusCodes.Status400BadRequest)]
[产品响应类型(StatusCodes.Status401Unauthorized)]
[产品响应类型(StatusCodes.Status500InternalServerError)]
公共IActionResult AddMyStuffBatches(列出批次)
查询字符串上显示的身份验证值实际上与模型无关——它们与流程上载的数据无关。因此,它们不应出现在
batches
列表中或作为
MyStuffBatch
的特定实例的属性


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

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

网址:

行动:

[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)
[HttpPost]
[产品响应类型(StatusCodes.Status201Created)]
[产品响应类型(StatusCodes.Status400BadRequest)]
[产品响应类型(StatusCodes.Status401Unauthorized)]
[产品响应类型(StatusCodes.Status500InternalServerError)]
public IActionResult AddMyStuffBatches(列出批次,[FromQuery]字符串时间戳,[FromQuery]字符串apiKey)

这似乎有效!谢谢当我用
[ApiController]
注释控制器类时,我没有意识到我可以使用类似
[FromQuery]
的注释。
[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)