Web API 2 中的方法名称约定

本文关键字:约定 方法 API Web | 更新日期: 2023-09-27 18:34:15

是否有Web API 2中使用的约定的列表?

以这两种方法为例。两者都是作品,都没有用属性装饰。

IHttpActionResult GetMyModel(int id)
IEnumerable<MyModel> GetAllMyModels()

Get响应路由"{控制器}/{操作}/{id}",所以我假设GetAllMyModels因为它的返回类型而工作?还是GetAll前缀?

还有其他约定吗?

在相关的说明中,为什么GetAllMyModels返回一个枚举对象,而GetMyModel返回IHttpActionResult中的MyModel?我应该从GetAllMyModels回来IHttpActionResult吗?

Web API 2 中的方法名称约定

如果方法的名称以定义的 HTTP 方法开头,则在没有特定属性定义的情况下,该方法将映射到该方法。

private static Collection<HttpMethod> GetSupportedHttpMethods()

System.Web.Http.Controllers.ReflectedHttpActionDescriptor用途_supportedHttpMethodsByConvention

private static readonly HttpMethod[] _supportedHttpMethodsByConvention = 
{ 
    HttpMethod.Get, 
    HttpMethod.Post, 
    HttpMethod.Put, 
    HttpMethod.Delete, 
    HttpMethod.Head, 
    HttpMethod.Options, 
    new HttpMethod("PATCH") 
};

<截图 />

// Get HttpMethod from method name convention 
for (int i = 0; i < _supportedHttpMethodsByConvention.Length; i++)
{
    if (methodInfo.Name.StartsWith(
        _supportedHttpMethodsByConvention[i].Method, 
        StringComparison.OrdinalIgnoreCase))
    {
        supportedHttpMethods.Add(_supportedHttpMethodsByConvention[i]);
        break;
    }
}

请注意,如果未定义任何其他方法,则 POST 是默认的 HTTP 方法。

您可以通过浏览 Web API 2 源代码来了解发生了什么。

因此,要扩展它似乎只是返回某种元素集合的约定。您可以愉快地返回单个元素,它只是映射参数,在本例中为 0。

对于GetAllMyModels案例,我尝试了各种替代方案,它解决了以下问题。

GetAllMyModels - Yes
GetMyModels - Yes
我的型号 - No
获取马匹 - 是

因此,答案似乎是,如果签名以 Get 开头,并且具有返回 IEnumerable* 的签名,并且 EntityType 与其他控制器方法上使用的类型匹配,并且它没有参数,则将其用作返回所有实体的方法。

*我的边例,返回类型是可枚举的而不是 IHttpActionResult 是速记。它等效于 IHttpActionResult 的返回类型并返回 Ok(值)。