我有一个简单的html文件。它访问url1并成功解析json响应。
客户 - > URL1 - >对客户的回应
我在html中修改了我的代码并调用了URL2
客户 - > URL2 - > URL1 - >对URL2的响应 - >对客户的回应
我评论了url1并调用了url2。 url2是一个简单的servlet,它调用url1并获取响应。 servlet将相同的响应返回给客户端,但这次ajax / jquery返回解析错误。当我发出警报(request.responseText)时,它与URL1返回的响应完全匹配。
$.ajax({
//url: "http://abc1.com", // Line 1
url: "http://abc2.com", // Line 2
data: {param1, param2},
dataType: "jsonp",
type: "GET",
async:false,
success: function(parsed_json) {
alert("Success");
},
error: function (request, status, error) {
alert("Error" + error);
alert(request.responseText);
}
Servlet只是一个层,它将输入流的内容复制到输出流。
InputStream input = new URL(url).openStream();
resp.setContentType("application/json");
// Apache commons IOUtils to copy
IOUtils.copy(input, resp.getOutputStream());
resp.getOutputStream().flush();
我手动验证了json-string-response,它看起来是一样的。 可能是什么问题呢 ?
答案 0 :(得分:1)
以下是一个可能的问题:我注意到dataType
为jsonp
,与json
不同。如果请求在JSON-P期待时以JSON的形式返回,jQuery可能会抛出错误。将dataType
更改为json
会改变什么吗?
顺便说一下,区别在于:
JSON-P主要用于与远程网站进行通信。由于浏览器出于安全原因无法将AJAX请求发送到其他域,因此JSON-P“AJAX请求”实际上会向DOM添加类似的内容:
<script src="http://www.otherwebsite.com/info.js?callback=myCallback"></script>
如果远程站点支持JSON-P,它将返回如下内容:
myCallback({"foo": "bar"})
然后使用来自远程站点的数据调用myCallback
函数 - ta da!
如果您说dataType
为jsonp
,jQuery会自动处理所有这些回调业务,但是,如果您说jsonp
但不将数据包装在一个回调,(据我所知)jQuery会注意到脚本已加载并抛出错误,因为回调从未触发过。
或者它是 JSON-P而我只是在喘息。无论如何。以防万一:)
答案 1 :(得分:0)
为此我查了jquery documentation,看来“跨域请求和dataType:”jsonp“请求不支持同步操作”。因此,如果您更改为async:true
,您可能会有更多运气。 :)