尝试执行POST以使用我自己的基于.Net WebApi的REST服务在嵌套URL上创建新的REST资源时遇到以下问题。
请设想以下网址 api / parents / {parentId} / children ,我要在其上执行POST以添加其他子项。
这与以下所述的问题非常相似:Using asp webapi to post a nested resource。但是在global.asax中我没有成功用 routes.MapHttpRoute(...)定义一个路由,该路由调用包含 {parentId} 的Parents-controller的方法以及要添加/发布的Child对象,例如主叫:
[HttpPost]
public HttpResponseMessage AddChildToParent(int parentId, Child newChild) {
//implementation
}
(这也与上述问题的答案不同,因为它没有提供任何可以添加的对象。)
我正在网上搜索,但遗憾的是我找不到解决方案 - 可能也是,因为我甚至找不到关于 defaults -object的语义的官方文档,用作参数 MapHttpRoute()方法。
有人可以为我的问题建议一个有效的路由定义,或者至少发布一个链接到 MapHttpRoute()中使用的默认对象的有用文档吗?非常感谢!
答案 0 :(得分:0)
尝试将以下Web API路由添加到注册功能。 (默认情况下,注册函数在WebApiApplication
Application_Start
上传递,System.Web.HttpApplication
继承自GlobalConfiguration.Configure(...)
,传递给函数WebApiConfig
。默认情况下,它在静态类{{1}中定义}}。)
添加
config.Routes.MapHttpRoute(
name: "PostChild",
routeTemplate: "api/{controller}/{parentId}/children",
defaults: new { action = "AddChildToParent" },
constraints: new
{
httpMethod = new HttpMethodConstraint(HttpMethod.Post),
controller = "Parents"
}
);
到注册函数,其中config
是HttpConfiguration
对象参数。
然后通过网址api/parents/{parentId}/children
调用ParentsController
中的以下方法:
public class ParentsController : ApiController
{
[HttpPost]
public HttpResponseMessage Post([FromUri]int parentId, [FromBody] Child child) {
//implementation
}
}
请注意,defaults
中的constraints
和MapHttpRoute
参数都是匿名对象,其属性名称对应于Web API变量名称。由于无法通过URL设置action
变量,因此它会获得一个默认值,该值指向控制器中的Web API方法。
constraints
对象限制对给定正则表达式的调用。在这种情况下,它是固定的控制器名称,但也可以是多个控制器,例如按"(Parents|ParentsAlternative)"
。只有满足所有约束条件的Web API调用才会导致调用Controller方法,此处为AddChildToParent
。
此处的Child
对象在HTTP正文中作为JSON传递,如参数属性[FromBody]
中所示。