2014-12-03 59 views
0

我有一个测试JSONP服务器,它在发出HTTP GET请求时返回一个JSONP对象。它可以返回标准的JSONP函数或回调变量中请求的函数。例如。在URL中定义和生成回调的JQuery JSONP请求

http://my.host:8024

JSONP_CALLBACK([ { “味精”: “这是丹尼斯的生日在咖啡角落EVERONE蛋糕!!!!(而持续;-))!”},{ “味精“:”由于网络延迟,域OBIEE_1中的某些客户可能会因为网络延迟而遇到性能下降,请联系Paul以获得详细信息“}, {”msg“:”Weblogic域WL_ENG_1将因22:00和00:00之间的维护而关闭“} ]);

http://my.host:8024/?callback=demo

demo([ 
    {"msg":"It is Dennis birthday! Cakes for everone at the coffee corner !!!! (while it lasts ;-))"}, 
    {"msg":"Some customers in domain OBIEE_1 may experience performance degradation due to network latency, contact Paul for details"}, 
    {"msg":"Weblogic domain WL_ENG_1 will go down due to maintenance between 22:00 and 00:00"} 
]); 

这个例子是用于测试AngularJS $ HTTP JSONP方法,并工作正常测试这些脚本。现在我正在尝试开发一个简短的jQuery脚本来检索此演示服务器的相同JSON数据。 jQuery脚本是;

<script type="text/javascript" charset="utf-8"> 

var htmlData = "<ul><li>Ticker was not successfully initialized</li></ul>" ; 

// callback function for JSONP ajax request 
function msgsJsonCallback(jsonData) { 
    htmlData = "<ul>" ; 
    // get all msg values from JSON data 
    // JSON format ([{"msg":"message 1"{,{"msg":"message 2},......]) 
    $.each(jsonData, function() { 
     htmlData += "<li>" + this['msg'] + "</li>" ;   
    }) ; 
    httmlData = htmlData + "</ul>" ; 
    $('#tickerMessage').vTicker('stop'); 
    $('#tickerMessage ul').replaceWith(htmlData); 
    $('#tickerMessage').vTicker('init',{speed: 1500, pause: 10000}); 
} 

function RefreshMessages() { 
    var url= "http://my.host:8024/?callback=?" ; 
    $.ajax({ 
     type: 'GET', 
     url: url, 
     jsonpCallback: 'msgsJsonCallback', 
     dataType: 'jsonp', 
     timeout: 5000, 
     success: function(json) { 
      console.log("Success") ; 
      console.dir(json) ; 
     }, 
     complete: function(jqXHR, textStatus){ 
      console.log("COMPLETE: " + textStatus) ; 
     } 
    }); 

    // schedule next refresh 
    setTimeout(function() { 
     RefreshMessages(); 
    }, 60000); 

} 

// initialize message ticker on document-ready 
$(document).ready(function() { 
    RefreshMessages(); 
}) ; 


</script> 

预期HTTP请求是http://my.host:8024/?callback=msgsJsonCallback,但由此产生的HTTP请求类似于http://my.host:8024/?callback=msgsJsonCallback&_39430030203。所以可能指定的回调函数和生成的回调函数都在JSONP请求中。

当(基于其他例子)改变“var url =”http://my.host:8024/?callback=?“;”到“var url =”http://my.host:8024/?callback=“;” HTTP请求更改为“http://my.host:8024/?callback=&callback=msgsJsonCallback&39430030203”。或改变URL时,“VAR URL =” http://my.host:8024“的请求的URL变成” http://my.host:8024/?callback=msgsJsonCallback&=39430030203”。

就如何解决这个问题是能够理解的任何帮助!

+0

启用[CORS](http://enable-cors.org/)并删除jsonp,如果可以的话[[这是为什么](http://json-p.org)) – Endless 2014-12-04 13:33:02

回答

1

_=someRandomNumber位被添加作为一种变通方法保证Ajax请求接收新的数据,而不是打到浏览器缓存的

如果要删除这一点,添加cache: true选项:

function RefreshMessages() { 
var url= "http://my.host:8024" ; 
$.ajax({ 
    type: 'GET', 
    url: url, 
    jsonpCallback: 'msgsJsonCallback', 
    dataType: 'jsonp', 
    timeout: 5000, 
    success: function(json) { 
     console.log("Success") ; 
     console.dir(json) ; 
    }, 
    complete: function(jqXHR, textStatus){ 
     console.log("COMPLETE: " + textStatus) ; 
    }, 
    cache: true 
}); 

}

+0

感谢您对_randomNumber 。这有我正确的理解,以解决这个在我写的bash webserver的侧面。该脚本只需要一个url变量,因此将“?callback = callbackname&_randomnumber”解释为一个url变量。 – pcvnes 2014-12-03 20:24:27