使用 jQuery 1.5 将请求作为 jsonp 发送,将响应解释为文本

Posted

技术标签:

【中文标题】使用 jQuery 1.5 将请求作为 jsonp 发送,将响应解释为文本【英文标题】:send request as jsonp, interpret response as text, using jQuery 1.5 【发布时间】:2012-03-03 14:03:04 【问题描述】:

小问题:有没有办法向服务器发出 jsonp 请求,捕获请求,但不将其解析为 javascript?我在 jQuery 1.5 中使用 dataType: "jsonp text" 但它不起作用。

我正在尝试使用 jsonp 通过 AJAX 访问跨域 URL。问题是另一个域(我大学的目录列表)非常旧,我怀疑服务器是否支持 jsonp。

在 Firefox 中,我收到“XML 标记名称不匹配(预期为 META)”错误。在 chrome 中,我得到一个“Uncaught SyntaxError Unexpected token 我无法进行正常的 AJAX 调用——当我将数据类型更改为“文本”或将其全部删除时,其他域抱怨用户未通过身份验证并重定向到登录页面——即使我'已经登录浏览器端。当 dataType 为 jsonp 时,不会发生这种情况。 我知道服务器需要支持 JSONP,但我不认为它支持,但是当我将 dataType 更改为 JSONP 时,我可以看到响应页面资源显示在 Chrome 和 Firefox 中——所以服务器实际上发送对浏览器的响应(静态 html 网页 + 一些 java 脚本)——其中包含我想要获取的数据。 问题是 jQuery 试图将响应解析为 javascript,但失败了(因为它不是 javascript)。所以数据最终会出现在浏览器中——我只需要访问它! 使用 dataType: "jsonp text" 应该指示发送 jsonp 请求并将响应解释为文本没有区别——仍然是解析错误。

我想要的是:一种将 jsonp 请求的响应作为纯文本访问的方法。或者,如果我可以从失败的 jsonp 请求中访问原始响应——那也可以。

提前致谢!

代码:

ajax_url = 'https://somesite/?searchTerm='+query+'&searchType=lastname';
var jqxhr = $.ajax(type:"GET",
url: ajax_url,
dataType:"jsonp text",
callback: "whatever",
success:function(responseData) 
   $('div#content').text( responseData.slice(0, 100) );
   dbg(responseData.slice(0,100));
)
.success(function()  alert("success"); )
.error(function(obj, errStr)  alert("error"); dbg("error: " + errStr + "test: " + test.responseText + this.responseTxt);)
.complete(function()  alert("complete"); );

【问题讨论】:

你有没有试过把你访问的数据放在一个js变量中,然后用js标签括起来。如果它试图将其解析为 js 似乎是有道理的。 【参考方案1】:

您尝试实现的目标不起作用:只有当服务器正确地将响应嵌入到 javascript 函数调用中时,才能使用 jsonp。

即使服务器确实将文件发送到浏览器,由于安全限制,您将无法访问它:您所能做的就是将所述数据作为脚本(带有脚本标签)执行或将其用作样式表(使用链接标签),但如果响应来自另一个域,您将永远无法检查原始文本中的响应。

我想你试图直接以 xml 格式获取数据并且它失败了(意味着该站点不支持CORS)。如果您无法在服务器端更改代码,那么您只有两种选择:

    在您自己的服务器上创建一个代理,该代理将隧道响应(您的服务器端脚本发出实际请求并将其发送到浏览器):然后从客户端的角度应用相同域,您将能够以 XML 格式请求数据, 使用 flash 绕过浏览器的安全性(您可以使用flXHR,但现在似乎有点过时了)。

【讨论】:

谢谢!唉,这是我怀疑的。我确实阅读了有关 CORS(服务器绝对不支持它)和相同的源策略,回想起来,即使服务器将响应发送到 jsonp,我也无法检查它是有道理的。我确实考虑过执行选项 1(通过我自己的服务器代理它),但不幸的是我需要对客户端进行身份验证。我会给 flXHR 一个机会。再次感谢。 关于客户端认证浏览器/flash,您可能会发现以下感兴趣的问题:***.com/questions/2161401/…

以上是关于使用 jQuery 1.5 将请求作为 jsonp 发送,将响应解释为文本的主要内容,如果未能解决你的问题,请参考以下文章

jquery jsonp请求错误处理

jQuery jsonp跨域请求

jQuery jsonp跨域请求

jQuery jsonp跨域请求详解

jQuery使用JSONP实现跨域请求

Ajax解决跨域--jQuery发送jsonp请求