Javascript DOJO跨域调用返回数据,但由于脚本标记中的语法错误而失败

Javascript DOJO跨域调用返回数据,但由于脚本标记中的语法错误而失败,javascript,dojo,cross-domain,Javascript,Dojo,Cross Domain,我正在使用DOJO库试验Javascript的跨域调用。我调用的web服务返回JSON。 为此,我使用“dojo.io.script.get”。 web服务没有为callbackParamName建立任何特定的查询字符串参数,因此我使用了ar任意名称,例如“callback”。 DOJO将注入回脚本标记,结果如下所示(从Firebug中提取): {“GeocodeAddressResponse”:{“Result”:{“PropertyArray”:{“PropertyySetProperty

我正在使用DOJO库试验Javascript的跨域调用。我调用的web服务返回JSON。
为此,我使用“dojo.io.script.get”。 web服务没有为callbackParamName建立任何特定的查询字符串参数,因此我使用了ar任意名称,例如“callback”。 DOJO将注入回脚本标记,结果如下所示(从Firebug中提取):


{“GeocodeAddressResponse”:{“Result”:{“PropertyArray”:{“PropertyySetProperty”:[{“Key”:“Shape”,“Value”:{“X”:“-8841758.9684124179”,“Y”:“5474103.2948672064”,“SpatialReference”:{“WKT”:“PROJCS[\“WGS\U 1984\U Web\U Mercator\U辅助球\”,GEOGCS[\“GCS\U WGS\U 1984\”,基准面[\“D\U WGS\U\U 1984”,球体[\“WGS\U 1984”,格林威治[“WGS\U\1984],25723],单位[\\\”,0.0174532925199433]],投影[\\\'Mercator\u辅助球\],参数[\'False\u Easting\”,0.0],参数[\'False\u Northing\”,0.0],参数[\'Central\u Meridian\”,0.0],参数[\'Standard\u Parallel\u\u 1\”,0.0],参数[\'s\u辅助球类型\',0.0],单位[\'Meter\”,1.0],权限[\'EPSG\”,20057],“里格森”:“37700”:“-30241100”,“XYScale”:“10000”,“ZOrigin”:“-100000”,“ZScale”:“10000”,“MOrigin”:“-100000”,“MScale”:“10000”,“XY公差”:“0.001”,“MT公差”:“0.001”,“高精度”:“真”,“WKID”:“3857”}}},{“键”:“状态”,“值”:“M”},{“键”:“分数”,“值”:“100”},{“键”:“匹配地址”,“值”:“1145尼科尔森路,新市场,ON,L3y”{“键”:”预类型“,”值“:”,”城市“,”值“:”新市场“,”地址类型“,”值“,”街道地址“,”值“,”79.426873000000001“,”,”键“:”Y“,”值“:”44.05594099999999997“,”键“,”侧“,”值“,”R“,”键“,”房屋“,”值“,”1145“,”键“,”PreDir“,”值“,”值“,”,”键“,”键“,”街道名“,”值“,”尼科尔森“,”键“,”,”键“,”苏福德“,”,”值“,”键“,”,”,“,”值“,”,“,”,”,“,“,”键“,“,“,”键“,”,“,”值SufDir,Value:“},{”Key:“},{”Key:“{”Key:“Postal”,“Value:“L3Y”},{”Key:“Disp_Lon”,“Value:“},{”Key:“Disp_Lat”,“Value:“},{”Key:“Loc name”,“Value:“CAN_Streets”}
问题是浏览器(IE或Firefox)抱怨“语法错误-预期”;“”。基本上它不喜欢在脚本标记中注入的JSON响应中的冒号“:”。 代码方面,Javascript在这一行崩溃: 加载:函数(响应、ioArgs)

我认为这可能与callbackParamName有关……但是服务器不需要任何特定的名称。 有人能建议我如何解决这个问题吗

这是我正在使用的代码:

<head>
<script type="text/javascript" src='dojo-release-1.8.0-src/dojo/dojo.js' data-dojo-config='parseOnLoad: true, isDebug:true'></script>

<script type="text/javascript">

dojo.require("dojo.io.script");

   function DOJOtoWS() {

       var targetNode = dojo.byId("results");

       var jsonpArgs = {

         url: "http://localhost:8281/services/TestGeocodeWorldLocator.TestGeocodeWorldLocatorHttpEndpoint",             
         callbackParamName: "callback",             
         content: {format : "json"},                         
         load: function(response, ioArgs){

           console.log(response);
           return response;

           // Set the data from the search into the viewbox in nicely formatted JSON
           targetNode.innerHTML = "<pre>" + dojo.fromJson(response) + "</pre>";

         },
         error: function(response, ioArgs){
           targetNode.innerHTML = "An unexpected error occurred: " + response;

           console.log("error");
           console.log(response);
           return response;
         }
       };
       dojo.io.script.get(jsonpArgs); 
  }

  dojo.ready(DOJOtoWS);

require(“dojo.io.script”);
函数DOJOtoWS(){
var targetNode=dojo.byId(“结果”);
var jsonpArgs={
url:“http://localhost:8281/services/TestGeocodeWorldLocator.TestGeocodeWorldLocatorHttpEndpoint",             
callbackParamName:“回调”,
内容:{格式:“json”},
加载:函数(响应、ioArgs){
控制台日志(响应);
返回响应;
//将搜索中的数据设置为格式良好的JSON格式的viewbox
targetNode.innerHTML=“+dojo.fromJson(响应)+”;
callback({"GeocodeAddressResponse": "blah blah blah"});
}, 错误:函数(响应,ioArgs){ targetNode.innerHTML=“发生意外错误:”+响应;
callback({"GeocodeAddressResponse": "blah blah blah"});
控制台日志(“错误”); 控制台日志(响应); 返回响应; } }; dojo.io.script.get(jsonpArgs); } 道场就绪(道场);



您所描述的听起来像是什么。因此,服务器需要以JSONP格式发送数据,而不是JSON格式。

Dojo注入的脚本中存在语法错误,因为
Dojo.script.io
希望服务器以以下格式返回结果:

说明:Dojo内部构造了一个名为“callback”的函数,以便它可以执行从服务器发送的JSONP。此函数处理数据并将其发送到您的
load
函数。请尝试像Dojo一样以JSONP格式发送数据的服务器进行验证(http://ajax.googleapis.com/ajax/services/search/web)

解决方法:

如果无法控制跨域服务器返回的格式,则必须在同一源服务器上设置跨域代理,或者将浏览器配置为允许跨域AJAX调用


您可能还想调查哪一个新的、更安全的标准是用来取代JSONP的。

FYI:dojo.io.*已被弃用。请改用新的dojo/request/*模块:谢谢您的回答。我将研究设置代理以解决跨域问题。