【问题标题】:No 'Access-Control-Allow-Origin' over rxjs [duplicate]rxjs上没有'Access-Control-Allow-Origin' [重复]
【发布时间】:2017-11-14 04:51:59
【问题描述】:

我一直在构建简单的反应应用程序,它显示以下 crytowat.ch api。 https://api.cryptowat.ch/markets

这是我的 redux-observable Epic 代码

const cryptowatchEpic = action$ =>
action$.ofType(FETCH_PRICE).mergeMap(action =>
    ajax({
      url: `${baseUrl}${action.payload}/btcusd/price`,
      crossDomain: true,
      method: 'GET',
      headers: {
        'Access-Control-Request-Origin': 'https://api.cryptowat.ch/'
      },
      withCredentials: true
    }).map(response => fetchPriceFilled(response))
  );

这是控制台错误

XMLHttpRequest 无法加载 https://api.cryptowat.ch/markets/kraken/btcusd/price。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost:3000' 不允许访问。响应的 HTTP 状态代码为 405。

我认为在标题中传递了Access-Control-Request-Origin,但出现错误。有什么我错过的吗?

提前致谢

【问题讨论】:

  • 看起来该 api 不打算在浏览器中使用。检查 cryptowatch 是否提供浏览器友好的 API,或者如果没有,您必须在后端服务中实现这些调用。
  • 您仍然可以通过 CORS 代理发出请求,从前端代码中使用该 API;试试url: `https://cors-anywhere.herokuapp.com/${baseUrl}${action.payload}/btcusd/price`(当然删除headers: { 'Access-Control-Request-Origin': 'https://api.cryptowat.ch/' }

标签: ajax cors rxjs redux-observable


【解决方案1】:

你搞错了。

服务器负责发送'Access-Control-Request-Origin' 标头,而不是客户端。

因此,换句话说,您需要服务器端访问才能在其中添加这些标头。更多信息请访问"No 'Access-Control-Allow-Origin' header is present on the requested resource"

【讨论】:

  • 这听起来可能很愚蠢,但我如何从服务器获取 'Access-Control-Request-Origin' 标头?
  • 您必须访问服务器并在那里配置/添加代码以使其返回这些标头。如果您无权访问服务器(也就是它不是您的),您将无能为力。 (在这种情况下,唯一的选择是您设置自己的服务器,将每个呼叫转发到原始服务器......)
  • 感谢您的解释。我想使用的 api 看起来像公共 Api,我使用 chrome 浏览器访问它正确响应。所以你的意思是我应该建立服务器来传递 api?
  • 是的,完全正确。您说“我使用 chrome 浏览器访问它响应正确”,这是正常行为。只有当您通过 JavaScript Ajax 访问 API 时才需要这些标头。
  • 非常感谢你帮了我很多忙 :) 干杯
猜你喜欢
  • 2019-02-28
  • 2019-02-06
  • 2016-08-12
  • 2019-03-30
  • 2018-11-17
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
相关资源
最近更新 更多