我如何从 ajax 调用中获取 HTTP 状态代码 200 而不是 202

How do i get HTTP status code 200 instead of 202 from an ajax call

以下代码总是收到 HTTP“202 已接受”状态代码:

当我使用邮递员尝试相同的 API 时,我得到 200 OK”:

function ExportStatus() {
  function ExportStatusAjax() {
    $.ajax({
      type: "GET",
      url: "https://api.powerbi.com/v1.0/myorg/groups/" + groupId + "/reports/" + reportId + "/exports/" + exportId + "",
      headers: {
        "Authorization": "Bearer " + accessToken
      },
      success: function(data, textStatus, jqXHR) {
        if (jqXHR.status == 200) {
          GetExportFile()
        } else {
          ExportStatusAjax()
        }
      },
      error: function(err) {
        alert(error)
      }
    });
  }

  ExportStatusAjax()
}

你有一个永远不会结束的递归。 ExportStatusAjax() 至少在 2 个地方调用自己。将其从您的代码中完全删除。如果没有 400x 或 500x,请不要太在意状态码。一旦 returns 成功,您就可以继续了。

我不熟悉 Power BI,所以我不能肯定地说,但是从你的代码和 API 状态代码来看,这看起来像是一个异步 API .这意味着,不同于 HTTP 中客户端提交请求并获得响应的传统模型(这是一个 200,a.k.a。OK),客户端提交 HTTP 请求,然后response 是一个占位符,告诉你真正的响应还没有准备好。

202 被称为 Accepted,我相信在这种情况下,它被用来表示您的请求已被接受到队列中。这个想法是,如果你继续重试,最终它会完成,你会得到真正的响应,它带有 200 的状态代码。报告、分析或其他类型的计算量大的工作负载通常遵循这种模式。

这种方法是一种常见的模式。如果这实际上是这里发生的事情,那么您的代码可能是正确的并且看到 202200 之间的响应翻转是正常的。

话虽如此,您的方法是不断地攻击服务器。一旦返回 202,它会立即重试,这会增加远程系统的负载,理论上这实际上可能会减慢它的速度。

我建议设置一个计时器来延迟重试,也许每 3 秒或 5 秒左右。 setTimeout函数可以帮到你。