在 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”(参数“ 1337 ”不应该存在)发送 POST 请求,它会调用 Post(Document document) 方法。但我希望框架在这种情况下显示错误。(例如“未找到此请求的 API 调用”)。
使用 REST WCF,我可以严格配置它......我对这种“约定优于配置”并不那么热情......
以及如何做更复杂的 URL 模板?
- 我想要这样的东西:
带有此 URL 模板的 GET 请求的 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 _ _
具有特征的部分应该是动态/可变的。