【问题标题】:HTTP Get or Post returns empty JSON arrayHTTP Get 或 Post 返回空 JSON 数组
【发布时间】:2026-01-12 09:50:02
【问题描述】:

当我调用我的 API Web 服务时,它返回一个空数组。

在我的 Header 请求中,我只有一个用于身份验证的 jwt 令牌

在 Angular 中:

getSheets(): Observable<Sheet[]> {
return this.http.get(this.config.apiUrl + '/api/SheetsRelationAPI', this.jwt())
  .map(this.extractData)
  .do(data => console.log('SheetsData:', data))  // debug
  .catch(this.handleError);

在 Asp.net MVC 5 中:

[HostAuthentication("bearer")]
[System.Web.Http.Authorize]
public class SheetsRelationAPIController : ApiController
{
    private GSheetsContext db = new GSheetsContext();

    // GET: api/SheetsRelation

    [ResponseType(typeof(SheetsRelationView))]
    public IQueryable<SheetsRelationView> GetSheetsRelation()
    {

        var claims = (User.Identity as System.Security.Claims.ClaimsIdentity).Claims;
        var username = "";
        foreach (var claim in claims)
            if (claim.Type.ToString() == "sub")
            {
                username = claim.Value.ToString();
            }
        //var tasks = from tsk in db.SheetsRelation.Include(s => s.SheetsContent.id  )
        //select tsk;

        var sheetsRelation = db.SheetsRelationView.Where(jt => jt.Username == username);




        return sheetsRelation;
    }
}

更新 1:

它似乎在 PostMan 中有效,我有一个 JSON 作为响应但在 Angular 中,我没有任何 JSON 作为响应。

【问题讨论】:

  • 声明似乎是空的。你调试过控制器看看发生了什么吗?
  • 我认为this.http.get(this.config.apiUrl + '/api/SheetsRelationAPI', this.jwt()) 应该是this.http.get(this.config.apiUrl + '/api/SheetsRelationAPI', { headers: yourHeaders }。您尚未指定要在键值对中发送的标头。
  • @Hinrich 声明不为空,我们用 Postman 测试,成功返回 JSON
  • @EkanshRastogi 让我试试你的代码,jwt() 是一种返回标头的方法,但我将提取它并手动设置以查看结果

标签: asp.net json asp.net-mvc angular


【解决方案1】:

三件事你不妨试试——

  1. 与这个问题无关,但我总是用特定的 http 方法装饰我的 API,以确保我没有任何混淆 - 在这种情况下是 [HttpGet]

  2. 重构您的 API 类,使其不直接依赖 GSheetsContext 和 User.Identity(让自己成为一个可注入的服务来处理它,以便您可以模拟该行为。)

  3. 使用模拟的依赖项对控制器方法进行单元测试,这样您就可以确定控制器的行为符合预期。

编辑,如果这听起来工作太多

注释掉你现有的控制器逻辑,并在那里放置一个只返回类似return db.SheetsRelationView.Create()的存根方法

如果可行,那么您就知道您的问题不在于您的 API,而在于逻辑。然后再参考上面的步骤 2 和 3 ;)

【讨论】:

  • 我注意到,如果我在 asp.net MVC 网站域之外调用 API,它可以正常工作,但如果我像我的 Angular 项目一样在同一个域中调用它。它返回一个空的 JSON
  • 从 Angular 调用时,听起来您的声明没有被填充。如果无法调试,请尝试在方法中添加日志记录。
  • 如果没有为您的用户名声明找到值,您也可以考虑返回 Unauthorized()。