发布嵌套资源并返回新位置Uri

时间:2017-07-11 08:51:33

标签: asp.net rest api asp.net-web-api2

我创建了一个apicontroller,它提供了一个Post方法来创建一个新的嵌套资源(在这个例子中:customer> mediaFile):

[Route("api/Customer/{customerId}/MediaFile", Name = "CreateMediaFileForCustomer")]
[HttpPost]
[ResponseType(typeof(MediaFile))]
public IHttpActionResult Post(long customerId, [FromBody]MediaFile mediaFile)
{
    ...

    return CreatedAtRoute("CreateMediaFileForCustomer", new { id = mediaFile.Id }, mediaFile);
}

我希望CreatedAtRoute方法返回一个如下所示的位置标题:

http://localhost:51656/api/Customer/1/MediaFile/37

但我得到了这个:

http://localhost:51656/api/Customer/1/MediaFile?id=37

经过一段时间的努力,我想出了一个“解决方案”,不知何故感觉像是一种俗气的方式:

[Route("api/Customer/{customerId}/MediaFile/{generatedMediaFileId:long?}", Name = "CreateMediaFileForCustomer")]
[HttpPost]
[ResponseType(typeof(MediaFile))]
public IHttpActionResult Post(long customerId, [FromBody]MediaFile mediaFile)
{
    ...

    return CreatedAtRoute("CreateMediaFileForCustomer", new { generatedMediaFileId = mediaFile.Id }, mediaFile);
}

因此,我有一个可选的资源ID,我只需要正确设置位置标头。这是它的工作方式吗?还是有更优雅的解决方案?

谢谢!

1 个答案:

答案 0 :(得分:1)

“CreatedAtRoute”位置标头应返回一个URL,您可以在其中看到新创建的资源。您使用的路径名与POST方法相同。所以我希望看到类似的东西:

[HttpGet()]
[Route("api/Customer/{customerId}/MediaFile/{id}", Name="GetMediaFileForCustomer")]
public IHttpActionResult Get(long customerId, long id)
{
    ....
}

您的CreatedAtRoute将是:

return CreatedAtRoute("GetMediaFileForCustomer", new { customerId = customerId, id = mediaFile.Id }, mediaFile);