Http GetJsonAsync 从服务器 API 返回 null

Posted

技术标签:

【中文标题】Http GetJsonAsync 从服务器 API 返回 null【英文标题】:Http GetJsonAsync returns null from server API 【发布时间】: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 方法?您看到检索到的数据了吗? 【参考方案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";

【讨论】:

以上是关于Http GetJsonAsync 从服务器 API 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

使用 httpClient.GetJsonAsync 错误的 Blazor Rest Api 调用

如何从 apache Web 服务器输入过滤器返回 HTTP 403?

Cisco 无线AP刷机为胖AP

锐捷 ac ap 连接 记录

scp文件传输

华为AP3010DN-AGN升级为胖AP