【发布时间】: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