我创建了一个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,我只需要正确设置位置标头。这是它的工作方式吗?还是有更优雅的解决方案?
谢谢!
答案 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);