【问题标题】:CORS Error on Wikipedia API维基百科 API 上的 CORS 错误
【发布时间】:2017-07-06 02:45:46
【问题描述】:

我对如何在 react 中处理 wikipedia api 调用感到有些困惑。我一直遇到这个错误:

跨域请求被阻止:同源策略不允许读取远程资源(...)

现在,我在提交表单时运行一个操作,表单获取表单输入值并将其插入到 Wikipedia api URL。我尝试过使用 JSONP,但我真的不想使用它,因为我听说它超级 hacky。

actions/index.js

import axios from 'axios';

const WIKI_URL = "https://en.wikipedia.org/w/api.php?action=query&format=jsonp&list=search&titles=";
const FETCH_ARTICLES = 'FETCH_ARTICLES';

export function fetchArticles(term) {
  const url = `${WIKI_URL}${term}`;
  const request = axios.get(url);

  return {
    type: FETCH_ARTICLES,
    payload: request
  }

如有必要,我当然可以添加更多代码,但据我所知,这就是问题所在。

edit:如果我必须使用 JSONP,我仍然无法使用。我相信axios不支持JSONP,有没有更好的库可以使用?为什么有些 API 会出现跨域引用错误,而有些却没有?

【问题讨论】:

标签: javascript ajax reactjs cors react-redux


【解决方案1】:

删除 format=jsonp 并将 origin=* 添加到 WIKI_URL 值中的查询参数:

const WIKI_URL = "https://en.wikipedia.org/w/api.php?origin=*&action=query…";

the CORS-related docs for the Wikipedia backend:

对于匿名请求,origin 查询字符串参数可以设置为*,这将允许来自任何地方的请求。

format参数而言,JSON输出是默认的,所以你不需要指定。

【讨论】:

    【解决方案2】:

    为了在不使用 JSONP 的情况下解决此问题,解决方案是使用代理服务器来接受您的请求,并将正确的 CORS 标头添加到响应中。作为起点,这将有助于作为参考:https://gist.github.com/pauloricardomg/7084524

    【讨论】:

    • 我希望有一个比创建代理服务器更简单的解决方案。为什么有些 API 会导致此问题,而有些则不会?据我所知,每次你引用一个 API 时,你调用的不是你的域
    • 如果域是“跨域”,意味着端点不解析到提供脚本的域;浏览器发出一个 OPTIONS 请求以查看是否允许当前源发出某个请求。如果 API 未将您的域包含在允许的来源列表中,浏览器将阻止该请求。这是为了防止恶意客户端应用程序访问不应被允许访问的资源。
    猜你喜欢
    • 2018-05-27
    • 2014-11-14
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    相关资源
    最近更新 更多