如何重载基于 HttpPost Web API 方法的 Json 数据类型属性
How to Overload HttpPost Web API Method Based Json Datatype Properties
我被要求实现一个 REST Web API 到一个特定的路由,其中可以发布两种不同的 Json 数据类型中的任何一种。
这会导致抛出以下异常:
Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: The request matched multiple endpoints.
是否有可以放置在 Web 方法上的属性,引用 Json 有效负载的属性以消除两种可能的数据类型的歧义?
但我会补充一点。
这样做并不好 API 设计,并且违反了 Swagger / OpenAPI 规范来执行您的要求。
使用相同的 HTTP 方法(POST 在您的情况下)执行此操作的唯一方法是在两个模型中执行一个操作。检查哪个不为空,然后路由到正确的方法来处理该逻辑。
如果您可以使用不同的 HTTP 动词,您可以在技术上做到这一点,并有两个单独的操作方法(如 POST 和 PUT),但您不会“正确”使用它们,并且根据您的问题和需要,我怀疑您是否能做到这一点。
您可以将请求正文作为字符串读取,然后尝试确定要反序列化的类型:
[HttpPost]
[Route("api/mypath")]
public async Task<IActionResult> MyMethod()
{
request.Body.Position = 0;
var reader = new StreamReader(request.Body, Encoding.UTF8);
var body = await reader.ReadToEndAsync();
if(body.Contains("A))
{
var A = JsonConvert.DeserializeObject<A>(body);
}
else{
var B = JsonConvert.DeserializeObject<B>(body);
}
}
并添加一个中间件来启用请求缓冲:
app.Use(next => context => {
context.Request.EnableBuffering();
return next(context);
});
您可以阅读更多相关信息here
我被要求实现一个 REST Web API 到一个特定的路由,其中可以发布两种不同的 Json 数据类型中的任何一种。
这会导致抛出以下异常:
Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: The request matched multiple endpoints.
是否有可以放置在 Web 方法上的属性,引用 Json 有效负载的属性以消除两种可能的数据类型的歧义?
这样做并不好 API 设计,并且违反了 Swagger / OpenAPI 规范来执行您的要求。
使用相同的 HTTP 方法(POST 在您的情况下)执行此操作的唯一方法是在两个模型中执行一个操作。检查哪个不为空,然后路由到正确的方法来处理该逻辑。
如果您可以使用不同的 HTTP 动词,您可以在技术上做到这一点,并有两个单独的操作方法(如 POST 和 PUT),但您不会“正确”使用它们,并且根据您的问题和需要,我怀疑您是否能做到这一点。
您可以将请求正文作为字符串读取,然后尝试确定要反序列化的类型:
[HttpPost]
[Route("api/mypath")]
public async Task<IActionResult> MyMethod()
{
request.Body.Position = 0;
var reader = new StreamReader(request.Body, Encoding.UTF8);
var body = await reader.ReadToEndAsync();
if(body.Contains("A))
{
var A = JsonConvert.DeserializeObject<A>(body);
}
else{
var B = JsonConvert.DeserializeObject<B>(body);
}
}
并添加一个中间件来启用请求缓冲:
app.Use(next => context => {
context.Request.EnableBuffering();
return next(context);
});
您可以阅读更多相关信息here