对于Web API 2的模板,post方法通常如下所示:
[ResponseType(typeof(MyDTO))]
public IHttpActionResult PostmyObject(MyDTO myObject)
{
...
return CreatedAtRoute("DefaultApi", new { id = myObject.Id }, myObject);
}
我不理解这个 CreatedAtRoute()
方法。有人能解释一下吗?
对于Web API 2的模板,post方法通常如下所示:
[ResponseType(typeof(MyDTO))]
public IHttpActionResult PostmyObject(MyDTO myObject)
{
...
return CreatedAtRoute("DefaultApi", new { id = myObject.Id }, myObject);
}
我不理解这个 CreatedAtRoute()
方法。有人能解释一下吗?
CreatedAtRoute
方法旨在在调用 POST 方法存储新对象时返回指向新创建资源的 URI。例如,如果您提交了一个订单项,则可能会返回如 'api/order/11' 的路由(其中 11 显然是订单的 ID)。[Route("[controller]")]
创建一个对象,在返回什么(以便可以使用URL调用相邻的GET操作)? - Shimmy WeitzhandlerCreatedAtRoute
时,第一个参数是指向资源的GET
的路由名称。并非显而易见的技巧是,即使指定了正确的方法名称,您也必须在HttpGet属性上使用Name参数才能使其正常工作。POST
返回如下内容:return CreatedAtRoute("Get", routeValues: new { id = model.Id }, value: model);
即使您的方法名为Get,您的Get方法属性也应该像这样:
[HttpGet("{id}", Name = "Get")]
调用您的Post方法不仅会返回新对象(通常为JSON格式),而且还会在响应的Location头中设置可以获取该资源的URI。
请注意,routeValues
字段中的字段名称需要与目标路由中的绑定名称匹配,即需要有一个名为id
的字段来匹配{id}
在HttpGet("{id}"
中的。
最后,有些情况下,应该提到CreatedAtAction
助手可能是更直接的解决方案。
[Microsoft.AspNetCore.Mvc.NonAction]
public virtual Microsoft.AspNetCore.Mvc.CreatedAtRouteResult CreatedAtRoute (string routeName, object routeValues, object content);
如上所示,CreatedAtRoute 方法可以接收 3 个参数:
routeName 是您必须在方法中输入的名称,该方法将是在创建后获取该资源的 URI。
routeValues 是包含将传递给命名路由的 GET 方法的值的对象。它将用于返回创建的对象。
content 是已创建的对象。
上面的示例展示了一个简单控制器的两种方法的实现,其中包括具有绑定名称的简单 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);
}
}
重要提示
请注意,在CreatedAtRoute(routeName)的第一个参数必须与Get方法中Name的定义相同。
第二个参数中的对象将需要具有用于在Get方法中检索资源所使用的必要字段,可以说它是创建的对象本身的子集。
最后一个参数是在请求主体中接收到的完整公司对象。
最终结果
作为最终结果,当向此API提交创建新公司的Post时,您将返回类似于“api/company/{id}”的路由,该路由将返回新创建的资源。