Can anyone explain CreatedAtRoute() to me?
在Web API 2的模板中,post方法始终像这样:
1 2 3 4 5 6 |
我不明白这种
因此,例如,如果您发布一个订单商品,则可能会返回一条类似于" api / order / 11"的路由(显然11是订单的ID)。
顺便说一句,我同意MSDN文章对理解这一点毫无用处。您实际返回的路由自然取决于您的路由设置。
当您使用CreatedAtRoute时,第一个参数是Get to the resource的方法名称。不太明显的诀窍是,即使指定了正确的方法名称,也必须在HttpGet属性上使用Name参数才能使其正常工作。
因此,如果您的帖子中的退货是这样的:
1 |
然后,即使您的方法名为Get,您的Get方法属性也应如下所示:
1 | [HttpGet("{id}", Name ="Get")] |
调用Post方法不仅会返回新对象(通常为JSON),还会在响应的URI上设置Location标头,以获取该资源。
在.net核心WebAPI中,您使用此方法返回201代码,这意味着已创建对象。
1 2 | [Microsoft.AspNetCore.Mvc.NonAction] public virtual Microsoft.AspNetCore.Mvc.CreatedAtRouteResult CreatedAtRoute (string routeName, object routeValues, object content); |
如上所示,CreatedAtRoute可以接收3个参数:
routeName
是您必须放在方法上的名称,该方法将是创建后将获得该资源的URI。
routeValues
它是包含将在指定的路由处传递给GET方法的值的对象。它将用于返回创建的对象
内容
这是创建的对象。
上面的示例显示了简单控制器的两种方法的实现,其中简单控制器具有绑定名称的简单GET方法和创建新对象的POST方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | namespace BastterAPI.Controllers { [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 Company { CompanyID = company.CompanyID }, company); } } } |
重要
请注意,CreatedAtRoute(routeName)上的第一个参数必须与Get方法的Name定义相同。
第二个参数上的对象将需要具有用于获取Get方法上的资源所必需的字段,可以说这是自身创建的对象的子集
最后一个参数是在正文请求中以完整格式收到的公司对象。
最终
最终结果是,当创建新公司的邮政使用此API时,您将返回一条路由,例如" api / company / {id}",这将返回给您新创建的资源