【问题标题】:Can't fetch data, CORS issue, trying to hack it with JSONP, still not working无法获取数据,CORS 问题,试图用 JSONP 破解它,仍然无法正常工作
【发布时间】:2018-01-12 11:55:00
【问题描述】:

我正在尝试从http://www.recipepuppy.com/api/?q=onion&p=1 获取数据。 (示例查询)

它在浏览器中工作,但我试图在我的 React 应用程序中获取它,我遇到了“No 'Access-Control-Allow-Origin' header is present on the requested resource 错误。

所以我改变了策略,现在我尝试使用 JSONP (https://github.com/mzabriskie/axios/blob/master/COOKBOOK.md#jsonp)。

但我不能让它工作。我一直收到这个错误。有人可以帮我解决我的问题吗?

错误:

Uncaught ReferenceError: jp0 is not defined 在 ?q=onion&p=1&callback=__jp0:1

我的代码:

import jsonp from 'jsonp'

export const FETCH_RECIPES = 'FETCH_RECIPE'
export const SHOW_INFO = 'SHOW_INFO'

export function fetchRecipes (searchTermToDOoooooooooo) {
  const request = jsonp('http://www.recipepuppy.com/api/?q=onion&p=1', null, function (err, data) {
    if (err) {
      console.error(err.message)
    } else {
      console.log(data)
    }
  })

  return (dispatch) => {
    /*
    request.then(({ data: data1 }) => {
      dispatch({ type: FETCH_RECIPES, payload: data1 })
    })
    */
  }

}

export function showInfo (info) {
  return {
    type: SHOW_INFO,
    payload: info
  }
}

该错误在开发工具中的表现:

【问题讨论】:

  • JSONP 仅在目标站点理解的情况下才有效。如果它只返回 JSON,那么 JSONP 将失败。您必须编写自己的服务器端代理。您不能“破解”同源策略。 编辑等待;该站点看起来确实使用 JSONP 响应。似乎有些东西没有正确设置全局回调。
  • 你有使用 Axios 的经验吗?我想这可能就是问题所在。它应该为您创建全局函数“jp0”,但显然不是。
  • @Pointy 我不明白为什么不是。所以我应该用 axios 结合 JSONP 对吧?
  • 那么 JSONP 的实现非常简单:您将 &callback=name 添加到 URL 查询的末尾,然后确保有一个名为“name”的全局函数(当然可以是任何名称)。然后,您创建一个新的脚本标签,并将“src”设置为该 URL,并将该标签添加到您的页面。就是这样:当响应返回时,您的函数将被调用。我对配置那个库一无所知,所以我不知道为什么它不适合你。

标签: javascript json reactjs jsonp axios


【解决方案1】:

您不能使用仅客户端代码,至少不能使用 JSONP+Axios(Axios doesn't (natively) support JSONP;“jsonp”库与 Axios 不同),因为它是您从中获取信息的服务器违反跨域规则。在这种情况下,它是没有为 Access-Control-Allow-Origin 标头设置的 Recipe Puppy。

正如@Pointy 所提到的,一种选择是使用服务器端代理。

然后您的流程将转移到:

  1. 客户端调用服务器端代理获取信息。
  2. 代理调用 Recipe Puppy 的 API 并根据需要翻译或传递信息。
  3. 代理将该信息中继到客户端代码以进行进一步处理。

至于您目前转向 jsonp,似乎 jsonp 库由于某种原因没有正确导出 jp0。这可能是您的构建工具出错。您需要仔细检查您的设置,并确保您的构建工具选择了 jsonp 库并将其实际放入已编译的源代码中。

【讨论】:

  • 在这种情况下,正如我在(更新的)评论中提到的那样,服务器确实理解 JSONP。我认为问题出在 OP 试图使用的那个库中。
  • JSONP 请求不需要Access-Control-Allow-Origin
  • @Pointy 你是对的。我已经更新了我的回复以考虑到这一点。
  • @Shauna,好的,所以我需要自己构建这个代理?类似的东西?:stackoverflow.com/questions/2558977/ajax-cross-domain-call 或在 node.js 中类似:stackoverflow.com/questions/34685030/…
  • 这是一种方法,是的。它只是您服务器上的一个简单的东西,充当中介。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 2018-06-02
相关资源
最近更新 更多