从Web API 2的模板中,post方法总是这样:
[ResponseType(typeof(MyDTO))]
public IHttpActionResult PostmyObject(MyDTO myObject)
{
...
return CreatedAtRoute("DefaultApi", new { id = myObject.Id }, myObject);
}
我不明白这个CreatedAtRoute()
方法。任何人都可以向我解释CreatedAtRoute()
方法吗?
答案 0 :(得分:135)
CreatedAtRoute
方法用于在调用POST方法存储某个新对象时将URI返回给新创建的资源。
因此,如果你发布订单商品,你可能会返回一个类似'api / order / 11'的路线(11显然是订单的ID)。
BTW我同意MSDN文章对理解这一点毫无用处。您实际返回的路线自然取决于您的路由设置。
答案 1 :(得分:4)
在.net核心WebAPI中,您使用此方法返回201代码,这意味着该对象已创建。
[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方法。
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}”,这将向您返回新创建的资源
答案 2 :(得分:0)
使用CreatedAtRoute时,第一个参数是“获取资源”的方法名称。不太明显的诀窍是,即使指定了正确的方法名称,也必须使用HttpGet属性上的Name参数才能使它起作用。
因此,如果您的帖子中的退货是这样的:
return CreatedAtRoute("Get", new { newModel.Id}, newModel);
然后,即使您的方法名为Get,您的Get方法属性也应如下所示:
[HttpGet("{id}", Name = "Get")]
这不仅将返回新对象(通常以JSON形式返回),还将在响应的URI上设置Location标头,以获取该资源。