【问题标题】:ASP.NET MVC Web API 4 - Complexe URL templatesASP.NET MVC Web API 4 - 复杂的 URL 模板
【发布时间】:2012-05-15 09:02:32
【问题描述】:

在 WCF REST 中,我可以定义一个严格的 URL 模板。

在 ASP.NET MVC Web API 4 中我遇到了问题。

我正常注册了路线:

 routes.MapHttpRoute(
                 name: "DefaultApi",
                 routeTemplate: "api/{controller}/{id}",
                 defaults: new { id = RouteParameter.Optional }
             );

我的控制器有这个方法:

// POST /api/documents
public HttpResponseMessage<Document> Post(Document document) 
{...}

如果我使用此 URL“http://servername.com:53835/api/Documents/1337”发送 POST 请求(参数“1337”不应该存在),它调用 Post(Document 文档) 方法。但我希望框架在这种情况下显示错误。 (例如“未找到此请求的 API 调用”)。

使用 REST WCF,我可以严格配置它... 我对这种“约定优于配置”并不那么热情……

我该如何做更复杂的 URL 模板?

  • 我想要这样的东西:

带有此 URL 模板的 GET-Request 的 API: “http://servername.com:53835/api/Documents/1337” 获取特定的文档对象(包含创建日期、创建者等元数据......)。

另一个 GET-Request 应该使用以下 URL 检索文件本身(作为流): http://servername.com:53835/api/Documents/1337/File

我如何定义这种差异? 获取文档对象的 GET 方法如下所示:

// GET /api/documents/5
public HttpResponseMessage<Document> Get(int id)
{...}

如何定义具有相同参数的单独方法(在本例中为“id”)?我是否必须使用 WCF REST-Projects 中的方法属性配置 URL 模板?

我可以像这样编辑 {action} 占位符的路由:

routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{mandant}/{controller}/{id}/{action}",
                defaults: new { mandant = "profile", id = RouteParameter.Optional, action = RouteParameter .Optional}
            );

然后我可以使用方法属性 [ActionName("File")] 和 [AcceptVerbs("GET")] 撒谎:

[ActionName("File")]
[AcceptVerbs("GET")]
public HttpResponseMessage FileDownload(int id)

然后我可以调用:“http://servername.com:53835/api/Documents/1337/File”来获取文件。 但是如果我想要更多这些“动作”呢?

  • 更复杂的用例是包含重复部分的 URL。 类似的东西:(在这种情况下,我有一些项目特征。这个特征的数量应该是可变的)

http://servername.com:53835/api/Documents/characteristic_1/characteristic_2/characteristic_3 http://servername.com:53835/api/Documents/characteristic_1/characteristic_2

具有特征的部分应该是动态/可变的。

【问题讨论】:

    标签: asp.net-mvc wcf templates url asp.net-web-api


    【解决方案1】:

    我也尝试过这个方法,我发现这种方法在很多情况下可能会导致不希望的结果,并且会以某种方式使您的 API 难以使用。最适合我的是我的 API 方法只有一个输入参数,即 ID,并使用 URL 参数传递所有其他变量。

    为了避免 DRY-ing 的东西,你可以考虑写一个 ActionFilter 左右。

    【讨论】:

    • 什么是 ActionFilter?我对 WebApi-ActionFilter 的了解并不多。我可以用它们做什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2012-12-07
    • 2012-03-30
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2012-08-08
    相关资源
    最近更新 更多