2012-07-22 106 views
0

我有一个简单的html文件。它访问url1并成功解析了json响应。转发json响应

CLIENT - > URL1 - >响应客户

我修改了代码,HTML和调用URL2

CLIENT - > URL2 - > URL1 - >响应URL2 - >响应客户

我评论了url1并调用了url2。 url2是一个简单的servlet,它调用url1并获得响应。 servlet将相同的响应返回给客户端,但是这次ajax/jquery返回解析错误。当我alert(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串响应,它似乎是相同的。 可能是什么问题?

+2

你能否请一个例子json字符串。 (缩短,如果它是一个大样本) – Mithon 2012-07-22 02:18:00

+0

@Mithon json字符串很大,但在阅读您的评论后,我觉得我应该尝试使用较小的json字符串来找出问题。 – 2sb 2012-07-22 02:31:19

+0

这里有一个有用的linkey为你:http://jsonlint.com/ – Mithon 2012-07-22 02:52:47

回答

1

这里有一个可能的问题:我注意到dataTypejsonp,它不同于json。如果请求在期待JSON-P时以json的形式返回,jQuery可以想象会抛出一个错误。改变dataTypejson改变什么?

区别在这里,顺便说一句:

JSON-P主要用于远程通信的网站。因为浏览器无法发送AJAX请求到其他域出于安全原因,一个JSON-P“AJAX请求”实际上将增加像这样的DOM:

<script src="http://www.otherwebsite.com/info.js?callback=myCallback"></script> 

如果远程站点支持JSON-P,它将返回这样的事情:

myCallback({"foo": "bar"}) 

然后你myCallback功能从远程站点调用数据 - ただ!

jQuery的自动处理所有这些回调的业务,如果你说的是dataTypejsonp,但是,如果你说jsonp包装数据的回调,(据我所知)jQuery将发现脚本加载并且抛出一个错误,因为回调从未被触发。

或者也许它 JSON-P,我只是在屏气。无论如何。以防万一:)

+0

他试图做跨域脚本,这就是为什么他需要jsonp。我非常有信心js2是故意这样做的。 – Mithon 2012-07-22 03:31:06

+0

@Mithon:恩。问题是模棱两可的,因此,因为他有权访问URL2的源代码,所以我认为它在他的域中。只是在黑暗中拍摄,真的(: – Matchu 2012-07-22 03:48:02

+0

@Matchu我很长时间忽略了数据类型,你没有浪费你的时间,你的答案真的有帮助。谢谢。URL1不在我的域名中,支持jsonp,而当我写url2我是返回json数据类型,而不是jsonp。谢谢米通2。 – 2sb 2012-07-22 03:48:42

0

我查找了jquery documentation为此,并且它似乎“跨域请求和数据类型:”jsonp“请求不支持同步操作”。所以如果你改成async:true,你可能会有更多的运气。 :)