HTTP GET - 使用 Body 和 URI 参数 - [FromBody] 变量为空

HTTP GET - With Body and URI parms - [FromBody] variable is null

我有一个已实现为 POST 的端点。它实际上是幂等的,确实可以/应该是 GET 但因为所需的数据包括 collection 或列表,我将其更改为 POST 和 json body .

但团队发现这令人困惑。所以现在我被要求实现为带有 URI 参数和 body 列表的 GET 作为 JSON.

基本上我需要做的是这样的:

 GET http://localhost:123/locations/{locationID}/products/{productID}/stats/{dateRange}
 
 Body:  {"count":["exports","imports","anothertiem", "thisListCanbeLong"]}

我尝试将我的 c# 函数签名更改为如下所示:

    [HttpGet]
    [Route("/locations/{locationID}/products/{productID}/stats/{dateRange}")]
    [AllowAnonymous] 
    public ProductStats GetStats(ProductStatRequest request, [FromBody] List<string> typesofStats)
    {

然后当我尝试使用 Talent 或 Postman 使用此类请求调用端点时:

 http://localhost:123/locations/4/products/all/stats/15

Headers:

 Content-Type header is set to "application/json"

Body

{"count":["exports","imports","anothertiem", "thisListCanbeLong"]}

调用失败,typeofStats 列表为空。不确定如何在这种类型的端点中提取 body。

此外,虽然我读到 GET 可以处理 body,但也许这不是最好的方法。也许 POST 更好,我只需要回到团队并拒绝,或者 POST 可以同时处理 URI 参数和 body。 团队的问题是他们希望在 uri 中看到传递的位置 ID 和产品 ID 等 - 以使其与其余调用保持一致。

感谢您的帮助。

Asp.net MVC 框架使用命名约定,这意味着参数名称必须与请求数据名称相匹配。通过以下更改应该有效:

[AllowAnonymous, HttpGet("/locations/{locationID}/products/{productID}/stats/{dateRange}")]
public ProductStats GetStats(
    [FromRoute] ProductStatRequest request, 
    [FromBody] List<string> typesofStats)
{
    return new ProductStats
    { 
        Request = request,
        TypesOfStats = typesofStats
    };
}

public class ProductStatRequest
{
    public int LocationId { get; set; }

    public string ProductId { get; set; }

    public int DateRange { get; set; }
}

public class ProductStats
{
    public ProductStatRequest Request { get; set; }

    public List<string> TypesOfStats { get; set; }
}

...以及来自邮递员

的request/response

如果你想在请求正文中提供一个包含列表的对象,你应该期望在操作方法中使用相同的对象。

{"count":["exports","imports","anothertiem", "thisListCanbeLong"]}

应为:

public class StatsTypes
{
    public List<string> Count { get; set; }
}