【问题标题】:What should be casted in the Web API controller?应该在 Web API 控制器中投射什么?
【发布时间】:2020-09-12 04:38:42
【问题描述】:

我在我的 API 中创建了一个 POST 方法,并通过 Postman 调用它。尽管一切正常并且对象被插入到数据库中,但 Postman 给了我 HTTP 状态代码 204 No content - 就像没有要输出的内容一样。我编写代码的方式,我假设它应该输出我创建的对象。

TitleController.cs

[HttpPost()]
public IActionResult InsertTitle([FromBody] GtlTitle gtlTitle)
{
    try
        {
            return Ok(_gtlTitleRepository.InsertTitle(gtlTitle));
        }
        catch(Exception e)
        {
            return BadRequest();
        }
}

IGtlTitleRepository.cs

GtlTitle InsertTitle(GtlTitle gtlTitle);

MockGtlTitleRepository.cs

public GtlTitle InsertTitle([FromBody] GtlTitle gtlTitle)
{

    using (var connection = new SqlConnection(_connection))
    {
        connection.Open();
        return connection.ExecuteScalar<GtlTitle>(@"INSERT INTO GTL_TITLE (ISBN, VolumeName, TitleDescription, PublicationDate, AuthorID, PublisherID, TempID) 
                                                        VALUES (@ISBN, @VolumeName, @TitleDescription, @PublicationDate, @AuthorID, @PublisherID, @TempID)",
                                                       new
                                                       {
                                                           gtlTitle.ISBN,
                                                           gtlTitle.VolumeName,
                                                           gtlTitle.TitleDescription,
                                                           gtlTitle.PublicationDate,
                                                           gtlTitle.AuthorID,
                                                           gtlTitle.PublisherID,
                                                           gtlTitle.TempID
                                                       });
    }
}

我做错了什么?在 Postman 中完成 POST 方法后,我应该返回什么(以及在哪个控制器中)以检索对象?

【问题讨论】:

    标签: c# http asp.net-web-api postman


    【解决方案1】:

    您没有从 SQL 中返回任何内容。 您可能想要更新您的 SQL 以返回插入的 ID。

    你可以这样做:

    INSERT into GTL_TITLE <list of fields> VALUES <list of values>
    SELECT SCOPE_IDENTITY();
    

    如果你想返回整个对象,那么你需要使用你刚刚找到的 ID 运行一个额外的 select 语句

    SELECT <list of fields> FROM GTL_TITLE 
    WHERE your_primary_key_field = SCOPE_IDENTITY();
    

    如果您阅读文档,您会看到实际操作中的示例:

    https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.executescalar?view=dotnet-plat-ext-3.1

    我已经有一段时间没有做 SQL 了,所以这可能需要对语法进行一些更新

    把它分成两部分。

    1. 首先让简单的 SQL 部分工作。确保您可以插入对象并获得插入的 id。 完成此操作后,让代码部分使用简单的 id。你想进入一个运行代码的位置,然后在你的代码中得到一个 id。

    2. 一旦第一部分开始工作,然后再复杂一点,并返回整个对象,重复相同的过程。

    【讨论】:

    • 嗨!感谢您的回答,不幸的是它没有工作。我的方法仍然没有返回任何内容。
    • 添加了一些步骤,可以帮助您完成这项工作,从 sql 开始,然后从那里开始编写代码。
    猜你喜欢
    • 2020-01-28
    • 2012-09-20
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    相关资源
    最近更新 更多