为啥 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 不起作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 memset 功能不起作用? [复制]

为啥问号在 %% 内不起作用? [复制]

为啥增量运算符不起作用? [复制]

为啥这个 DirectoryInfo 比较不起作用? [复制]

为啥这个 bash expr 命令不起作用? [复制]

为啥 itertools.groupby() 不起作用? [复制]