2
votes

Http GetJsonAsync renvoie null à partir de l'API du serveur

J'essaie de créer une application à l'aide de Blazor et .NET Core 3 avec EF Core 3. J'ai configuré un modèle de base de données et une API pour les utilisateurs (/ api / users) et la navigation dans Chrome renvoie toutes les entités dans la base de données. Ma méthode GetJson dans le fichier Razor renvoie cependant null.

Voici mon fichier de code Razor:

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

La méthode GetJsonAsync semble renvoyer null, malgré les enregistrements dans la base de données et malgré le fait que je puisse afficher les entités au format Json en naviguant vers / api / users. Est-ce que mon implémentation est correcte et est-ce que quelqu'un sait comment résoudre ce problème?

Modifier: Code côté serveur:

@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>
}

}


12 commentaires

Y a-t-il des erreurs dans la console? Veuillez également modifier la question avec le code côté serveur.


@GerritBergen Post édité. Aucune erreur dans la console. La demande se termine par un code HTTP 200 réussi.


Ok, juste pour écarter certaines choses. Utilisez l'url "api / Users / GetUsers" dans votre client. Définissez également le type de retour sur l'API sur "Task >>". Veuillez également changer le type de réception en List au lieu de User [] Faites-moi savoir si cela ne fonctionne toujours pas


Hé une autre chose que j'ai remarquée, vous avez une barre oblique au début de votre URL de requête. Assurez-vous que ce n'est pas là. Il y a actuellement un bug où l'ajout entraînera un échec.


@Adam Creed, avez-vous Fiddler ou Postman? Si vous le faites, exécutez-le et interrogez votre API Web pour la méthode GetUsers? Voyez-vous des données récupérées?


@GerritBergen Désolé de ne pas vous avoir mis à jour, actuellement en programmation de vacances donc Internet n'est pas le plus fiable. J'ai essayé votre suggestion et GetUsers n'est pas un type reconnu. J'ai également essayé de changer le type de réception qui ne fonctionnait pas non plus. J'ai également supprimé le / de l'URL de l'API au début, ce qui ne fonctionnait pas. Je vais essayer de télécharger Fiddler mais comme je l'ai dit, Internet n'est pas le plus fiable :) Merci pour toutes les suggestions! Si quelqu'un a autre chose à ajouter, ce serait grandement apprécié :)


@GerritBergen Alors, voici une idée. Chaque fois que je référence le modèle directement sur le client, cela génère une erreur de compilation étrange. Quelque chose concernant EntityFrameworkCore.Abstractions n'a pas pu être trouvé. Pour résoudre ce problème, j'ai supprimé la référence au modèle du projet client et ajouté une classe en double pour l'utilisateur dans le projet partagé. Cela pourrait-il potentiellement être la cause du problème? Les deux classes sont identiques, donc je ne pense pas que cela ait de l'importance. Je peux rendre mon code GitHub public si quelqu'un souhaite approfondir mon code.


Oui, publier une référence à l'application complète ...


Habituellement, lorsque je passe des données du serveur au client, j'utilise un ViewModel, qui n'a aucune référence à la base de données / EntityFramework, donc je ne suis pas sûr. La source Github serait géniale. Mon nom d'utilisateur github est GerritBergen si vous préférez le garder privé. Bien que je ne puisse probablement pas jeter un coup d'œil plus tard.


@GerritBergen Ok, je me sens vraiment stupide en ce moment. Ça marche. Il s'avère que votre suggestion de liste l'a résolu, mais j'avais plusieurs onglets ouverts avec l'application et je regardais l'un de ceux-ci au lieu du bon. Merci pour l'aide! Pourriez-vous s'il vous plaît répondre à la question afin que je puisse la marquer comme résolue? À votre santé.


@Issac De plus, cela ne fonctionne pas avec le / devant, comme vous l'avez suggéré.


@AdamCreed Heureux d'entendre que ça marche! Hé, nous avons tous été là. Comprendre certaines de ces petites choses m'a aussi pris un certain temps. (surtout que "/", mec qui était une douleur XD) J'ai ajouté ma réponse ci-dessous :)


3 Réponses :


3
votes

Avoir une barre oblique devant l'URL est actuellement bogué, donc aucune requête ne sera acceptée. Utilisez plutôt api / Users / GetUsers dans votre client.

Définissez le type de retour sur l'API sur Task>> et changez le type de réception en List au lieu de Utilisateur [] .

Cela garantira que les types d'envoi et de réception ne correspondent pas.


0 commentaires

0
votes

J'ai également rencontré ce problème dans une version ultérieure. Cependant, dans mon cas, il semble qu'il s'opposait à la création de l'objet avec un constructeur. La suppression du constructeur et la création de l'objet comme ci-dessous ont fonctionné.

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


0 commentaires

0
votes

J'ai eu le même problème. Assurez-vous que la classe que vous essayez d'envoyer est une propriété avec des getters et des setters:

public string Name { get; set; }


0 commentaires