2012-07-14 47 views
1

尝试执行POST以使用我自己的基于.Net WebApi的REST服务在嵌套URL上创建新的REST资源时,我遇到了以下问题。在webApi上使用嵌套URL的RESTful POST

请想象以下网址API /父母/ {}的parentId /儿童上,我想执行POST添加另一个孩子。

这与在Using asp webapi to post a nested resource中描述的问题非常相似。但是在global.asax中,我没有成功使用路由来定义.MapHttpRoute(...)这是一个调用我父母控制器的方法的路由,其中​​包含{parentId}以及要添加的子对象/发布,例如电话:

[HttpPost] 
public HttpResponseMessage AddChildToParent(int parentId, Child newChild) { 
    //implementation 
} 

(这也是区别上面提到的问题的答案,因为它没有提供可以添加任何对象。)

我在网上搜索,但不幸的是我找不到解决方案 - 可能也是,因为我甚至找不到默认的语义的官方文档 -object用作MapHttpRoute()方法的参数。

可有人请建议我的问题工作路由定义或至少邮寄至默认在MapHttpRoute()使用 -object的有用文档的链接?非常感谢!

+0

在[this](http://stackoverflow.com/a/10030485)文章中的答案可能有助于解决您的问题。 – Miguel 2013-03-19 02:18:02

回答

0

尝试将以下Web API路由添加到注册功能中。 (默认登记功能在WebApiApplication被传递Application_Start,它从System.Web.HttpApplication继承,向功能GlobalConfiguration.Configure(...)。缺省情况下它在静态类WebApiConfig的已定义。)

添加

config.Routes.MapHttpRoute(
    name: "PostChild", 
    routeTemplate: "api/{controller}/{parentId}/children", 
    defaults: new { action = "AddChildToParent" }, 
    constraints: new 
    { 
     httpMethod = new HttpMethodConstraint(HttpMethod.Post), 
     controller = "Parents" 
    } 
); 

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

然后通过URL api/parents/{parentId}/childrenParentsController下面的方法将被调用:

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

注意,无论是defaultsMapHttpRouteconstraints参数与相应的Web API的变量名称属性名称的匿名对象。由于action变量不能通过URL进行设置,因此它会获得指向控制器中Web API方法的默认值。

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

这里的Child对象作为JSON在HTTP主体中传递,如参数属性[FromBody]中所示。