2012-10-25 4 views
8

最近、私は、クロスドメインの投稿要求を行うために、jQueryの$.ajaxの代わりにeasyXDMを使用する必要があることに気付きました。easyXDMでAJAXポストを介してキーと値のペアとしてJavaScriptオブジェクト/配列を送信するにはどうすればよいですか?

のjQuery:取得した後easyXDMは、私は機能がかなり密接に並んでいることがわかり設定

$.ajax({ 
    url: "/ajax/", 
    method: "POST", 
    data: myData 
}); 

easyXDM:

xhr.request({ 
    url: "/ajax/", 
    method: "POST", 
    dataType: 'json', // I added this trying to fix the problem, didn't work 
    data: myData 
}); 

MYDATAは、セットアップのようなもの:

myData = {}; 
myData[1] = 'hello'; 
myData[2] = 'goodbye'; 
myData[3] = {}; 
myData[3][1] = 'sub1'; 
myData[3][2] = 'sub2'; 
myData[3][3] = 'sub3'; 

jQueryでリクエストを行うと、サブフィールドは正しく処理されますが、easyXDMでは正しく処理されません。

screenshot-with-shadow.png http://img37.imageshack.us/img37/4526/screenshotwithshadow.png

そして、ここではそれがeasyXDMとしています方法です:

screenshot-with-shadow.png http://img204.imageshack.us/img204/4526/screenshotwithshadow.png

私は送ることができますどのようにここで

はPOSTリクエストがjQueryを使ってサーバーに入ってくる方法ですjavascriptオブジェクト/ jQueryのようなeasyXDM/XHRリクエストを介してキーと値のペアの配列ですか?

+0

ドキュメントから:あなたはシリアライザを上書きされない限り、あなたが期待するよう、あなたのオブジェクトが出てくる必要がありますので、「設定されていない場合はeasyXDMは、ネイティブJSONオブジェクトを使用しようとしますか」?おそらく、あなたの前のコードのどこかでタイプ強制が起こっていますか? – robC

+1

これはeasyXDMの問題かもしれないようです。 cors/index.htmlファイルのように見えますが、データが既に文字列かどうかを確認せずにデータをシリアル化し、マルチレベルのJSONエンコーディングを処理していないようです... https:// github。 – cwd

+1

@robC - あなたの今削除されたコメントに関して、easyXDMの問題だと思う - 私のテストhttp://pastebin.com/0eusK2vrを参照してください。 – cwd

答えて

4

はコメントで議論し、あなたがそれを使用することができる唯一の方法は、すなわち

xhr.request({ 
    url: "/ajax/", 
    method: "POST", 
    data: {jsonData: JSON.stringify(myData)} 
}); 

を.requestするためにそれを渡すときに代わりにあなたがあなた自身を作成することができ、手動でデータをシリアル化することですあなたはIE7以下を除外します。その後、Index.htmlとはJSON構造を作成するために、プロパティを解析べきではありません

JSON.stringify(myData) 

要求は今ではなくオブジェクトよりJSON文字列が含まれていますので:easyXDMは、手動でデータをシリアル化する必要が適切にシリアライズすることができないので

+0

これは、その問題がうまく解決されるまで巧妙な回避策のように見えます。私はそれを試してみましょう。 –

+0

本当に賢い!最も簡単な解決策は、少なくとも今のところ!ありがとう! :) –

+0

@SteveBrown IE7にJSON実装を含めることを忘れないでください! https://github.com/douglascrockford/JSON-js – robC

2

あなたはAJAX経由でドメイン間のリクエストを送信するのは間違いだと思います。 JavaScript APIに関係なく、実際にAJAX経由でドメイン間のリクエストを送信することができます。ただし、レスポンス・クロス・ドメインを受信するには、応答がデータ・タイプJSONPである必要があります。

JSONPは、単に、例えばパディングとJSONである:

JSON:

{ Key: "Hello", Value: "World" } 

JSONP:

callback({ Key: "Hello", Value: "World" }) 

これは、パスによって微妙な違いが、JSONPでありますブラウザと同じ起源のポリシーを使用して、別のサーバーによって提供されるJSONデータを消費することができます。あなたのWebサービスはJSONPではなくJSONとして結果を返していることを確認する必要があります動作するように、このために

$.ajax({ 
    url: "http://mydomain.com/Service.svc/GetJSONP?callback=callback", 
    dataType: "jsonp", 
    data: myData, 
    success: function(data) { 
     alert(data); 
    } 
}); 

:これを試してjQueryのAJAXを介して他のサーバーからJSONデータを消費する

。 easyXDMの限界を踏まえて

+0

easyXDMは、jsonpではなく、postMessageで隠しiframeを使用します。 – robC

+0

jQueryのクロスドメインajaxリクエストがすべてのブラウザでサポートされていないため、easyXDMを使用しようとしています。 –

+0

@SteveBrown JSONPはすべてのブラウザで動作します。しかし、あなたはGETリクエストでなければならないPOSTを使用することはできません。 – robC

1

。 easyXDMに付属のindex.htmlにアクセスし、次のコードを探します。

var pairs = []; 
for (var key in config.data) { 
    if (config.data.hasOwnProperty(key)) { 
     pairs.push(encodeURIComponent(key) + "=" + encodeURIComponent(config.data[key])); 
    } 
} 
data = pairs.join("&"); 

このコードはPOSTリクエストの場合には実行しないでください。ただ、データへのconfig.dataを割り当てる:

data = config.data; 
関連する問題