2012-05-15 59 views
2

在WCF REST中,我可以定义一个严格的URL模板。ASP.NET MVC Web API 4 - Complexe 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一个POST请求: 53835/api/Documents/“(参数”1337“不应该在那里),它调用Post(Document document)方法。但我想,框架在这种情况下显示一个错误。 (例如“找不到此请求的API调用”)。

休息WCF我能严格配置此... 我并不热衷这种“约定优于配置” ......

我怎么可以做更多的配合物的网址模板?

  • 我想是这样的:

的GET请求与该URL模板的API: “http://servername.com:53835/api/Documents/1337” 获取特定的文档对象(包含创建日期,创建者等元数据...)。

另一个GET请求应该找回的文件本身(如流),以这样的URL: http://servername.com:53835/api/Documents/1337/File

我如何定义这种差异? 用于获取文档对象一开始的方法是这样的:

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

我如何定义具有相同的参数(在这种情况下,“ID”)一个单独的方法?我是否必须使用WCF REST-Projects中的方法属性来配置URL模板?

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

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

,然后我可以使用的方法的属性[ActionName( “文件”)]和的[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

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

回答

0

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

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

+0

什么是ActionFilter?我没有发现WebApi-ActionFilter。我能用他们做什么? – user437899