有人能给我解释一下 CreatedAtRoute ()吗?

在 Web API 2的模板中,post 方法总是这样:

[ResponseType(typeof(MyDTO))]
public IHttpActionResult PostmyObject(MyDTO myObject)
{
...
return CreatedAtRoute("DefaultApi", new { id = myObject.Id }, myObject);
}

我不明白这个 CreatedAtRoute()方法。有人能给我解释一下吗?

59761 次浏览

CreatedAtRoute方法用于在调用 POST 方法存储某个新对象时将 URI 返回到新创建的资源。 因此,如果您发布一个订单项,您可能会返回一个类似于‘ api/order/11’的路由(11显然是订单的 id)。

顺便说一句,我同意 MSDN 文章对于理解这一点没有用处。您实际返回的路由自然取决于您的路由设置。

使用 CreatedAtRoute时,第一个参数是资源的 GET路线名称。不那么明显的技巧是,即使指定了正确的方法名,也必须使用 HttpGet 属性上的 Name 参数才能正常工作。

所以如果 POST的返回值是这样的:

return CreatedAtRoute("Get", routeValues: new { id = model.Id }, value: model);

那么,即使方法名为 Get,Get 方法属性也应该如下所示:

[HttpGet("{id}", Name = "Get")]

对 Post 方法的调用不仅会返回新对象(通常为 JSON) ,还会在响应到将获取该资源的 URI 的响应中设置 Location 标头。

注意,routeValues字段名称中的字段名称需要与目标路由中的绑定名称匹配,即需要有一个名为 id的字段来匹配 HttpGet("{id}"中的 {id}

最后,在某些情况下,应该提到的是,CreatedAtAction助手可以是一个更直接的解决方案。

在.net 核心 WebAPI 中,使用此方法返回201代码,这意味着已创建该对象。

[Microsoft.AspNetCore.Mvc.NonAction]
public virtual Microsoft.AspNetCore.Mvc.CreatedAtRouteResult CreatedAtRoute (string routeName, object routeValues, object content);

如上所示,CreatedAtRoute 可以接收3个参数:

路由名称 必须放在方法上的名称,该方法将成为创建后将获取该资源的 URI。

它是包含将在指定路由传递给 GET 方法的值的对象。它将用于返回创建的对象

内容 这是创建的对象。

上面的例子展示了一个简单控制器的两个方法的实现,一个是带有绑定名称的简单 GET 方法,另一个是创建新对象的 POST 方法。

[Route("api/[controller]")]
[ApiController]
public class CompanyController : Controller
{
private ICompanyRepository _companyRepository;


public CompanyController(ICompanyRepository companyRepository)
{
_companyRepository = companyRepository;
}


[HttpGet("{id}", Name="GetCompany")]
public IActionResult GetById(int id)
{
Company company = _companyRepository.Find(id);


if (company == null)
{
return NotFound();
}
        

return new ObjectResult(company);
}


[HttpPost]
public IActionResult Create([FromBody] Company company)
{
if (company == null)
{
return BadRequest();
}


_companyRepository.Add(company);


return CreatedAtRoute(
"GetCompany",
new { id = company.CompanyID },
company);
}
}


很重要

  1. 注意,CreatedAtRoute (routeName)的第一个参数必须与 Get 方法的 Name 定义中的参数相同。

  2. 第二个参数上的对象将需要具有用于检索 Get 方法上的资源的必要字段,可以说它是创建自身的对象的子集

  3. 最后一个参数是主体请求中接收的完整形式的公司对象。

终于

最后的结果是,当创建新公司的 Post 使用这个 API 时,您将返回一个类似于‘ API/company/{ id }’的路由,该路由将返回新创建的资源