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; }
}
我有一个已实现为 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; }
}