HTTP GetJsonAsync возвращает ноль из серверного API - PullRequest
2 голосов
/ 30 мая 2019

Я пытаюсь создать приложение, используя Blazor и .NET Core 3 с EF Core 3. Я настроил модель базы данных и API для пользователей (/ api / users), и просмотр этого в chrome возвращает все сущностив базе данных.Однако мой метод GetJson в файле Razor возвращает ноль.

Вот мой файл кода 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 возвращает ноль, несмотря на то, что записи находятся в базе данных, и, несмотря на то, что я могу просматривать объекты в формате Json, перейдя к/ API / пользователей.Является ли моя реализация этой верной, и кто-нибудь знает, как потенциально решить эту проблему?

Редактировать: Код на стороне сервера:

[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);
    }
}

}

1 Ответ

3 голосов
/ 30 мая 2019

Наличие косой черты перед URL прямо сейчас ошибочно, поэтому запросы не будут проходить.Вместо этого используйте api/Users/GetUsers в своем клиенте.

Установите тип возврата в API на Task<ActionResult<List<User>>> и измените тип получения на List<User> вместо User[].

.убедитесь, что типы отправки и получения не совпадают.

...