任何人都可以向我解释CreatedAtRoute()吗?

时间:2014-07-30 19:44:48

标签: c# asp.net asp.net-web-api asp.net-web-api-routing

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

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

我不明白这个CreatedAtRoute()方法。任何人都可以向我解释CreatedAtRoute()方法吗?

3 个答案:

答案 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);

        }


    }
}

重要

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

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

  3. 最后一个参数是在正文请求中以完整格式收到的公司对象。

最终

作为最终结果,当创建新公司的邮政使用此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标头,以获取该资源。