为啥 JsonP 不起作用? [复制]
Posted
技术标签:
【中文标题】为啥 JsonP 不起作用? [复制]【英文标题】:Why JsonP doesn't work? [duplicate]为什么 JsonP 不起作用? [复制] 【发布时间】:2012-10-01 12:36:10 【问题描述】:可能重复:json Uncaught SyntaxError: Unexpected token :
jsonp 是否依赖服务器支持才能返回正确响应?
我收到了这个请求,返回的是js错误。
$.getJSON('myURL?q=keyword&callback=?', function(data)console.log(data));
即使是 angular jsonp 方法也不起作用:
http://jsfiddle.net/neoswf/tckGG/5/
控制台 >> js 错误:Uncaught SyntaxError: Unexpected token :
jsonp 是否依赖于某些服务器实现?
已解决!!!
这个问题与其他问题不同,因为没有其他答案涉及代理解决方案。
【问题讨论】:
【参考方案1】:服务器不返回 JSONP,它返回 JSON。 JSONP 结果是封装在函数调用中的 JSON 结果。
例子:
callback873659823745("destino":"http://...", ... )
如果您不能让服务器返回 JSONP,则需要一个代理服务器来请求该服务并返回包装为 JSONP 结果的 JSON 结果。
碰巧的是,我不久前在jsonp.guffa.com 设置了这样一个代理,如果你自己没有能力设置一个,你可以使用它。
演示:http://jsfiddle.net/Guffa/tckGG/6/
【讨论】:
@Guffa- 我怎样才能自己写一个?如果我要使用你的代理,恐怕对你来说太贵了...... 没关系。已经在网上找到了一些教程...blog.jsonpify.com 但是您是如何设法使用您的代理绕过源策略的?毕竟我发出了一个正常的获取请求,但被他们的服务器拒绝了。 @NeoSwf:同源策略仅适用于在浏览器中执行的脚本。【参考方案2】:因为您的 Url 没有返回 JSONP。它正在返回 JSON。
"destino":"http://www.buscape.com.br","palavras":["tv lcd 32","tv led","tv led 32","tv led 40","tv","tv led 42","tv lcd","tv lcd 42","tv lcd 26","tv 3d","tv lcd 40","tv 32","tv led 46","tv 42","tv lcd 22","tv led 32 full hd"]
以 JSONP 为例,检查来自flickr 的返回值。它返回
callbackToExecute(... JSON Object ...)
【讨论】:
【参考方案3】:是的,jsonp 需要服务器支持。服务端需要将json包装在json*P*的“padding”部分,这是客户端围绕响应数据定义和执行的方法。
【讨论】:
有办法绕过它吗?如果没有,并且如果服务器没有实现 CORS,那么我还有什么选择可以实现我的目标吗? @NeoSwf:你必须使用代理... 谢谢@FelixKling。你可以解释吗?代理怎么可能不调用跨域规则? @NeoSwf:您必须从您的域运行它,即创建一个接受 URL 的端点,连接到该 URL 并将响应返回到您的脚本。以上是关于为啥 JsonP 不起作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章