关于c#:有人可以向我解释CreatedAtRoute()吗?

Can anyone explain CreatedAtRoute() to me?

在Web API 2的模板中,post方法始终像这样:

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

我不明白这种CreatedAtRoute()方法。 谁能向我解释CreatedAtRoute()方法?


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

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


当您使用CreatedAtRoute时,第一个参数是Get to the resource的方法名称。不太明显的诀窍是,即使指定了正确的方法名称,也必须在HttpGet属性上使用Name参数才能使其正常工作。

因此,如果您的帖子中的退货是这样的:

1
return CreatedAtRoute("Get", new { newModel.Id}, newModel);

然后,即使您的方法名为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}",这将返回给您新创建的资源