事先说明,这两个接口的规范是甲方制定的,我无权修改。。。。
两个接口的开头如下(方法内容已经省略):
[HttpGet("provMns/{apiVersion}/nssts", Name = "getNSST")]
public IActionResult DoGetNSST(string apiVersion, [FromQuery] string nsstids)
{.....}
[HttpGet("provMns/{apiVersion}/nssts", Name = "getAllNSSTs")]
public IActionResult DoGetAllNSSTs(string apiVersion)
{.....}
实际使用PostMan测试时,如果发送Get请求消息的URL如下:
https://localhost:44353/api/rest/provMns/v1/nssts?nsstids=NSST-C-001-HDBNJ-NSSMF-01-A-ZX
就会报错:
Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: The request matched multiple endpoints. Matches:
MyRestfulApi.Controllers.MyRestfulApiController.DoGetAllNSSTs (MyRestfulApi)
MyRestfulApi.Controllers.MyRestfulApiController.DoGetNSST (MyRestfulApi)
明显是因为同时匹配到了两个不同的接口导致的,该如何在不改变接口规范的情况下修改代码呢?
在 Restful 的规则中同名方法重载时,请求类型不能一样。如果因为使用场景限制需要用到同名方法可以把代码改为下面这种:
[HttpGet("provMns/{apiVersion}/nssts", Name = "getNSST")]
public IActionResult DoGetNSST(string apiVersion, [FromQuery] string nsstids)
{
return Json(new { apiVersion , nsstids });
}
[HttpPost("provMns/{apiVersion}/nssts", Name = "getAllNSSTs")]
public IActionResult DoGetAllNSSTs(string apiVersion)
{
return Json(new { apiVersion });
}
这两个方法的区别是,前面是 HttpGet,后面是 HttpPost。这样就可以使用同名方法重载了。