【问题标题】:Using jQuery/Jsonp to send cross-domain request and parse result?使用 jQuery/Jsonp 发送跨域请求并解析结果?
【发布时间】:2013-07-17 12:16:37
【问题描述】:

我正在尝试使用 jQuery 从远程跨域站点获取和解析数据。为了避免同源策略和跨域问题,我使用 jsonp。

<html>  
<head>  
<title>Ajax Sample</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.min.js"></script>
</style>
<script>
$(document).ready(function(){
    //Obviously the service wont give a JSON format response
    var url='http://stackoverflow.com/search?q=Cross+domain';
    $.ajax({
     url:url,
     dataType: 'jsonp',
     success:function(data){
         console.log(data);
     },
     error:function(){
         alert("Error");
     },
    });
});
</script>
<body>
</body>  
</html>

但我得到的是error:

Resource interpreted as Script but transferred with MIME type text/html: "http://stackoverflow.com/search?q=Cross+domain&callback=jQuery1708665772899985313_1374154944485&_=1374154944492"

Uncaught SyntaxError: Unexpected token < 

那么如何以正确的方式制作呢?

【问题讨论】:

  • 代码开头的注释说明了问题不是吗?也就是说,“显然服务不会给出 JSON 格式的响应”——你不能只告诉 jQuery 使用 jsonp 并期望另一端的服务神奇地满足它。
  • 响应应该包含 jsonp 内容,而不是 html 或其他任何内容。
  • stackoverflow url 只是一个例子,重点是:我不知道服务返回的是哪种数据。大多数网站没有开放的 API 或返回 json 数据。我只是想找到一种通用的方式。
  • @SamSu 你不能使用 JSONP 访问任意跨域数据除非数据是 JSONP

标签: ajax jquery jsonp


【解决方案1】:

如果远程端没有为其 JSONP 输出设置正确的Content-Type 标头,则第一个警告是正常的。这只是一个警告,不会造成任何伤害。

如果第二个错误是由于尝试访问 stackoverflow 网站,那么该错误仅仅是因为您试图在 JS 解释器中抛出 HTML 代码。

请注意,JSONP 请求必须以有效 JS 脚本的形式接收 JSON。它不适用于任何其他类型的输入。

出于安全原因,您不能从其他来源访问其他类型的资源,除非这些资源发送适当的Access-Control-Allow-Origin HTTP 标头。

【讨论】:

  • Tks Alnitak。正如您在您的回答和评论中提到的那样,我想要做的事情是不可能的?因为请求的站点不返回 jsonp?
  • 在我的情况下,服务器返回了html,那么我应该怎么做才能解析它呢?
  • @SamSu 这是不可能的,除非远程站点设置了适当的 HTTP 标头。这还取决于您实际上想用这些资源做什么。例如,如果您只想检索它们但丢弃结果,则可以将 URL 设置为图像标记的 src 属性。
  • 是的,只是检索结果并在 google-chrome-extension 演示中显示数据。所以我无法让服务器端满足我的需求。我在客户端只有 html 和 javascript。
  • 啊,如果这是一个 chrome 扩展,那么也许你需要这个 - stackoverflow.com/questions/6051537/…
猜你喜欢
  • 2012-07-29
  • 2013-11-25
  • 2014-03-18
  • 2016-10-02
  • 2015-07-10
  • 1970-01-01
  • 2012-04-24
  • 2020-06-30
相关资源
最近更新 更多