在Web Api上使用嵌套URL的RESTful POST

时间:2012-07-14 08:50:02

标签: rest post asp.net-mvc-4

尝试执行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()中使用的默认对象的有用文档吗?非常感谢!

1 个答案:

答案 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"
    }
);

到注册函数,其中configHttpConfiguration对象参数。

然后通过网址api/parents/{parentId}/children调用ParentsController中的以下方法:

public class ParentsController : ApiController
{
    [HttpPost]
    public HttpResponseMessage Post([FromUri]int parentId, [FromBody] Child child) {
        //implementation
    }
}

请注意,defaults中的constraintsMapHttpRoute参数都是匿名对象,其属性名称对应于Web API变量名称。由于无法通过URL设置action变量,因此它会获得一个默认值,该值指向控制器中的Web API方法。

constraints对象限制对给定正则表达式的调用。在这种情况下,它是固定的控制器名称,但也可以是多个控制器,例如按"(Parents|ParentsAlternative)"。只有满足所有约束条件的Web API调用才会导致调用Controller方法,此处为AddChildToParent

此处的Child对象在HTTP正文中作为JSON传递,如参数属性[FromBody]中所示。