0

DOJO ライブラリを使用して、Javascript からのクロスドメイン呼び出しを試しています。呼び出している Web サービスは JSON を返します。
この目的のために「dojo.io.script.get」を使用しています。Web サービスは callbackParamName の特定のクエリ文字列パラメーターを確立しないため、「callback」などの任意の名前を使用しています。DOJO は SCRIPT タグを挿入し、結果を以下に示します (Firebug から抜粋)。

<script id="dojo_request_script0" type="text/javascript" src="http://localhost:8281/services/TestGeocodeWorldLocator.TestGeocodeWorldLocatorHttpSoap12Endpoint?format=json&callback=dojo.io.script.jsonp_dojoIoScript1._jsonpCallback" async="" charset="utf-8">

{"GeocodeAddressResponse":{"Result":{"PropertyArray":{"PropertySetProperty":[{"Key":"Shape","Value":{"X":"-8841758.9684124179","Y":"5474103.2948672064","SpatialReference":{"WKT":"PROJCS[\"WGS_1984_Web_Mercator_Auxiliary_Sphere\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Mercator_Auxiliary_Sphere\"],PARAMETER[\"False_Easting\",0.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",0.0],PARAMETER[\"Standard_Parallel_1\",0.0],PARAMETER[\"Auxiliary_Sphere_Type\",0.0],UNIT[\"Meter\",1.0],AUTHORITY[\"EPSG\",3857]]","XOrigin":"-20037700","YOrigin":"-30241100","XYScale":"10000","ZOrigin":"-100000","ZScale":"10000","MOrigin":"-100000","MScale":"10000","XYTolerance":"0.001","ZTolerance":"0.001","MTolerance":"0.001","HighPrecision":"true","WKID":"3857"}}},{"Key":"Status","Value":"M"},{"Key":"Score","Value":"100"},{"Key":"Match_addr","Value":"1145 Nicholson Rd, Newmarket, ON, L3y"},{"Key":"PreType","Value":""},{"Key":"City","Value":"NEWMARKET"},{"Key":"Addr_type","Value":"StreetAddress"},{"Key":"X","Value":"-79.426873000000001"},{"Key":"Y","Value":"44.055940999999997"},{"Key":"Side","Value":"R"},{"Key":"House","Value":"1145"},{"Key":"PreDir","Value":""},{"Key":"StreetName","Value":"NICHOLSON"},{"Key":"SufType","Value":"RD"},{"Key":"SufDir","Value":""},{"Key":"Province","Value":"ON"},{"Key":"Postal","Value":"L3Y"},{"Key":"Disp_Lon","Value":""},{"Key":"Disp_Lat","Value":""},{"Key":"Loc_name","Value":"CAN_Streets"}]}}}}

</script>

問題は、ブラウザー (IE または Firefox) が「構文エラー - 予想される ";"」というエラーを出すことです。基本的に、SCRIPT タグに挿入された JSON 応答のコロン ":" は好きではありません。コード的には、JavaScript は次の行でクラッシュします: load: function(response, 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);


4

1 に答える 1

0

あなたが説明しているのはJSONPのように聞こえます。したがって、サーバーは JSON ではなく JSONP 形式でデータを送信する必要があります。

dojo.script.ioはサーバーが次の形式で結果を返すことを想定しているため、Dojo によって挿入されたスクリプトに構文エラーがあります。

callback({"GeocodeAddressResponse": "blah blah blah"});

説明: Dojo は内部的に「callback」という名前の関数を作成して、サーバーから送信された JSONP を実行できるようにします。この関数はデータを処理し、関数に送信しますloadこの例(http://ajax.googleapis.com/ajax/services/search/web)のように、データを JSONP 形式で送り返すサーバーを試して確認します。

回避策:

クロスドメイン サーバーから返される形式を制御できない場合は、同じオリジン サーバーにクロスドメイン プロキシを設定するか、クロスドメイン AJAX 呼び出しを許可するようにブラウザーを構成する必要があります。

また、JSONP を置き換えることを目的とした、より安全な新しい標準であるCross-Origin Resource Sharing (CORS)を調査することもできます。

于 2012-08-30T19:17:11.220 に答える