【问题标题】:Http GetJsonAsync returns null from server APIHttp GetJsonAsync 从服务器 API 返回 null
【发布时间】:2019-05-30 14:16:02
【问题描述】:

我正在尝试使用 Blazor 和 .NET Core 3 和 EF Core 3 创建一个应用程序。我已经为用户 (/api/users) 设置了一个数据库模型和一个 API,并在 chrome 中浏览到它会返回所有实体在数据库中。但是,我在 Razor 文件中的 GetJson 方法返回 null。

这是我的 Razor 代码文件:

@page "/"
@using LogicX.Shared
@inject HttpClient Http

<h1>Users</h1>

@functions{
    User[] _users;
    protected override async Task OnInitAsync()
    {
        var users = await Http.GetJsonAsync<User[]>("/api/users");
        _users = users;
    }
}
@foreach (var usr in _users)
{
    <td>@usr.Username</td>
}

GetJsonAsync 方法似乎返回 null,尽管数据库中有记录,尽管事实上我能够通过浏览到 /api/users 来查看 Json 格式的实体。我的实现是否正确,有人知道如何解决这个问题吗?

编辑:服务器端代码:

[Produces("application/json")]
[Route("api/[controller]")]
[ApiController]
public class UsersController : Controller
{
    private readonly LogicXDbContext _context;

    public UsersController(LogicXDbContext context)
    {
        _context = context;
    }

    // GET: api/Users
    [HttpGet]
    public async Task<ActionResult<IEnumerable<User>>> GetUsers()
    {
        return await _context.Users.ToListAsync();
    }

    // GET: api/Users/5
    [HttpGet("{id}")]
    public async Task<ActionResult<User>> GetUser(int id)
    {
        var user = await _context.Users.FindAsync(id);

        if (user == null)
        {
            return NotFound();
        }

        return user;
    }

    // PUT: api/Users/5
    [HttpPut("{id}")]
    public async Task<IActionResult> PutUser(int id, User user)
    {
        if (id != user.Id)
        {
            return BadRequest();
        }

        _context.Entry(user).State = EntityState.Modified;

        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!UserExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return NoContent();
    }

    // POST: api/Users
    [HttpPost]
    public async Task<ActionResult<User>> PostUser(User user)
    {
        _context.Users.Add(user);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetUser", new { id = user.Id }, user);
    }

    // DELETE: api/Users/5
    [HttpDelete("{id}")]
    public async Task<ActionResult<User>> DeleteUser(int id)
    {
        var user = await _context.Users.FindAsync(id);
        if (user == null)
        {
            return NotFound();
        }

        _context.Users.Remove(user);
        await _context.SaveChangesAsync();

        return user;
    }

    private bool UserExists(int id)
    {
        return _context.Users.Any(e => e.Id == id);
    }
}

}

【问题讨论】:

  • 控制台有错误吗?也请使用服务器端代码编辑问题
  • @GerritBergen 已编辑帖子。控制台没有错误。请求以成功的 HTTP 200 代码完成。
  • 好的,只是为了排除一些问题。在您的客户端中使用网址“api/Users/GetUsers”。还将 API 上的返回类型设置为“Task>>”。请将接收类型更改为 List 而不是 User[] 如果它仍然不起作用,请告诉我
  • 嘿,我注意到的另一件事是,您的查询网址开头有一个正斜杠。确保它不存在。现在有一个错误,添加它会导致失败。
  • @Adam Creed,你有 Fiddler 或 Postman 吗?如果您这样做,请运行它并查询您的 Web API 以获取 GetUsers 方法?您看到检索到的数据了吗?

标签: c# .net-core entity-framework-core blazor


【解决方案1】:

在 url 前面有一个正斜杠现在是错误的,所以不会通过任何请求。 请在您的客户端中使用 api/Users/GetUsers

将 API 上的返回类型设置为Task&lt;ActionResult&lt;List&lt;User&gt;&gt;&gt;,并将接收类型更改为List&lt;User&gt;,而不是User[]

这样做可以确保发送和接收类型不会不匹配。

【讨论】:

    【解决方案2】:

    我有同样的问题。确保您尝试发送的类是具有 getter 和 setter 的属性:

    public string Name { get; set; }
    

    【讨论】:

      【解决方案3】:

      我在以后的版本中也遇到了这个问题。然而,在我的实例中,它似乎反对使用构造函数创建的对象。删除构造函数并创建对象,如下所示。

      var personal = new Personal() {YearofBirth = 1966, Gender="M", Email="alex@test.com"};

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 2011-03-14
        • 2016-12-31
        • 1970-01-01
        • 2019-01-12
        • 1970-01-01
        • 2021-04-04
        相关资源
        最近更新 更多