1

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

请想象以下 url api/parents/{parentId}/children我想在其上执行 POST 以添加另一个孩子。

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

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

(这也是上述问题答案的不同之处,因为它没有提供任何可以添加的对象。)

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

任何人都可以为我的问题建议一个有效的路由定义,或者至少发布一个指向MapHttpRoute()中使用的defaults -object 的有用文档的链接?非常感谢!

4

1 回答 1

0

尝试将以下 Web API 路由添加到您的注册函数中。(注册函数默认传入WebApiApplicationon Application_Start,继承自System.Web.HttpApplication, 到 function 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"
    }
);

到注册函数,object参数在config哪里。HttpConfiguration

然后通过 URL调用api/parents/{parentId}/children以下方法:ParentsController

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

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

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

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

于 2016-04-05T14:32:04.463 回答