【问题标题】: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 是否依赖于某些服务器实现?

已解决!!!

这个问题与其他问题不同,因为没有其他答案涉及代理解决方案。

【问题讨论】:

    标签: javascript jquery jsonp angularjs


    【解决方案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 并将响应返回到您的脚本。
      猜你喜欢
      • 2013-03-16
      • 2011-08-19
      • 2016-01-24
      • 2013-03-05
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多