当前位置: 首页 > 知识库问答 >
问题:

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

毛峻
2023-03-14

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

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

我不理解这个< code>CreatedAtRoute()方法。有人能给我解释一下吗?

共有3个答案

邹玄裳
2023-03-14

在.net core 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方法。

[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时,您将返回一个类似“API/company/{id}”的路由,该路由将返回新创建的资源

  • 方飞白
    2023-03-14

    当您使用< code>CreatedAtRoute时,第一个参数是资源的< code>GET的路由名称。不太明显的技巧是,即使指定了正确的方法名,也必须在HttpGet属性上使用Name param才能使它工作。

    因此,如果您的< code >帖子中的回复是这样的:

    return CreatedAtRoute("Get", routeValues: new { id = model.Id }, value: model);
    

    那么即使方法名为Get,Get方法属性也应该如下所示:

    [HttpGet("{id}", Name = "Get")]
    

    对Post方法的调用不仅会返回新的对象(通常是JSON),还会在对获取资源的URI的响应中设置位置头。

    注意routeValue字段名称中的字段名称需要与目标路由中的绑定名称匹配,即需要有一个名为id的字段来匹配{id}HttpGet("{id}"

    最后,在某些情况下,应该提到CreatedAtAction助手可以是更直接的解决方案。

    邢法
    2023-03-14

    CreatedAtRoute方法旨在在您调用POST方法来存储一些新对象时将URI返回到新创建的资源。因此,例如,如果您POST一个订单项,您可能会返回像'api/order/11'这样的路由(11显然是订单的id)。

    顺便说一句,我同意MSDN文章在理解这一点方面没有用处。您实际返回的路线自然取决于您的路由设置。

     类似资料:
    • 问题内容: 情况1:这不会引起?。谁能告诉我为什么这不会导致ConcurrentModificationException。 情况2:这是由于我尝试访问AsyncThread中的线程不安全的人员列表。我可以使我的“人员列表”实现是线程安全的,并且应该可以运行。 谁能解释我到底发生了什么。我无法理解这是如何解决问题的。 案例2是否将实现从更改为推荐? 添加例外: 05-28 20:34:21.073

    • 问题内容: 我不太了解Java中“ this”的用法。如果有人可以帮助我澄清一下,我将不胜感激。 在此网站上显示:http : //docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html “在实例方法或构造函数中,这是对当前对象的引用,该对象是正在调用其方法或构造函数的对象。使用此方法,您可以从实例方法或构造函数中引用当前对象的任何成员。

    • 问题内容: 有人可以在hibernate状态下向我解释吗?我很难理解它。 如果可以举一个例子来解释它,那就最棒了,并且它在哪种用例中最适用? 问题答案: 这是Object DB的一个很好的解释。 指定ManyToOne或OneToOne关系属性,该属性提供EmbeddedId主键,EmbeddedId主键内的属性或父实体的简单主键的映射。value元素指定关系属性所对应的组合键中的属性。如果实体的

    • 问题内容: 我想根据情况来确定状态字段,但是我得到的是空值。 问题答案: 您的子查询没有关联子句!他们所做的只是查询查询表中是否有任何一行不为null。 如果您对特定状态感兴趣,则必须查询该状态,例如: 但是,我怀疑您对 单个 项目的状态不感兴趣。相反,您想知道一堆行的状态。在这种情况下,将 单个 值存储在变量中将无济于事。您需要将其合并到查询中,并将子查询与外部查询相关联,如下所示(请参见表达式

    • 本文向大家介绍有人可以向我解释JavaScript变量之前的加号吗?,包括了有人可以向我解释JavaScript变量之前的加号吗?的使用技巧和注意事项,需要的朋友参考一下 变量之前的加号(+)定义您要使用的变量是数字变量。 在下面的代码中,有关于加号的简短描述。以下是代码- 示例 要运行上述程序,您需要使用以下命令- 输出结果 在这里,我的文件名为demo149.js。这将产生以下输出-

    • 我从一位同事的代码中读到了这几行: 我认为这将为Bean classA和classB创建2个数据源。为了注入数据源,我们需要如下内容: 但是Spring只创建了一个数据源,this.mysqlDataSource()每次都返回相同的数据源。它是怎么发生的?如果我确实需要另一个数据源,我需要立即创建它?