【问题标题】:axios response.data always empty but Postman worksaxios response.data 始终为空,但 Postman 有效
【发布时间】:2020-02-06 22:13:36
【问题描述】:

我正在尝试制作一个打开一个位 URL 并获取标题的扩展:

http://bit[dot]ly/30YbIyD

邮递员遵循重定向并为我获取结果文档。

当我尝试使用 Axios 时,我得到了空的响应数据,尽管重定向似乎发生了。

第一个请求收到指向“stackoverflow.com”的 301。在那个请求中,我们得到“200 SUCCESS”但是数据部分是空的。

axios({
    'url': 'http://bit[dot]ly/30YbIyD',
    method: 'get',
    maxRedirects: 5,
    headers: {
      'Content-Type': 'text/html',
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'GET',
    },
    withCredentials: true,
  })
  .then((res) => {
    console.log("Response", res)
  })
  .catch((err) => {
    console.log("Error with fetch: ", err)
  });

没有错误消息,但我希望看到与 Postman 返回相同的结果;最终文件。

我的浏览器控制台也收到这些警告:

Cross-Origin Read Blocking (CORB) blocked cross-origin response <URL> with MIME type text/html. See <URL> for more details.

http://bit.ly/ 的跨站点资源关联的cookie 设置为没有SameSite 属性。未来版本的 Chrome 将仅通过设置为 SameSite=NoneSecure 的跨站点请求传递 cookie。您可以在开发人员工具中的 Application>Storage>Cookies 下查看 cookie,并在 https://www.chromestatus.com/feature/5088147346030592https://www.chromestatus.com/feature/5633521622188032 上查看更多详细信息。

这是 Postman 发送的标头:https://imgur.com/765Cz30

【问题讨论】:

  • 我们可以检查 POSTMAN 发送的请求头或所有请求数据吗?
  • @LearningEveryday 当然,给你:imgur.com/a/OPqfvIX
  • 我能想到几件事。您可以尝试使用 POSTMAN 发送的标头吗?如果您不使用 axios 并使用简单的 fetch 方法怎么办?或者当您使用 axios 以外的任何东西时会发生什么?只是一个想法!
  • 我认为您所看到的行为的原因只是来自 http://bit.ly[dot]30YbIyD 的 301 响应不包含 Access-Control-Allow-Origin 标头。所以浏览器实际上并没有跟随重定向到https://stackoverflow.com/。这就是为什么 Chrome devtools 没有显示https://stackoverflow.com/ 响应的响应正文的原因——因为浏览器实际上从未向https://stackoverflow.com/ 发出任何请求。在 Firefox 或 Safari 中尝试相同的代码并查看那里的“网络”窗格,我认为您会更清楚地了解实际发生的情况。
  • 尝试进一步排除故障,尝试将 mode: 'no-cors' 添加到您的 axios 调用中 - 或者尝试使用 fetch('https://bit.ly[dot]30YbIyD', { mode: 'no-cors'})。在这种情况下,Chrome devtools 中的 Network 窗格将显示来自 https://stackoverflow.com/ 的响应的响应正文。这是因为在这种情况下,浏览器实际上会遵循 301 重定向。 (您将无法访问前端 JavaScript 代码的响应,但浏览器仍会收到它。)

标签: javascript get request cors axios


【解决方案1】:

使用以下步骤:
1.使用Axios拨打http://bit[dot]ly/30YbIyD
2. 从响应头中找到位置。 (accessing response header via Axios)
3. 调用 Location 中的 URL 获取实际内容。

*** 浏览器和 Postman 正在执行多个请求以获取内容。我在我的 Java 应用程序中使用了上述步骤。以下代码供参考

if ( HttpStatus.SC_MOVED_TEMPORARILY  == statusCode ) {
            location = method.getResponseHeader("Location").getValue();
            if (sLog.isDebugEnabled()) {
                sLog.debug("location: " + location);
            }                                                                  
}

【讨论】:

    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2021-09-10
    相关资源
    最近更新 更多