2014-02-12 85 views
0

我有類似的問題,例如Urlencoding in Dart。我可以通過HttpRequest.postFormData對Map進行編碼。但是JQuery的交方法可編碼Map<String, dynamic>. JQuery的例子:飛鏢深處的Urlencode

$.post("controller", 
{actualTime: 1357089552, events: [{priceInsert: 1.32128, priceExecution: 1.32128}]}, 
function(data) {/*handle*/}); 

螢火蟲的HttpRequest交視圖:

actualTime     1357089552 
events[0][priceExecution] 1.32128 
events[0][priceInsert]  1.32128 

淨荷源是:

actualTime=1357089552&events%5B0%5D%5BpriceInsert%5D=1.32128&events%5B0%5D%5BpriceExecution%5D=1.32128 

達特不能容易地做到這一點。有人解決了這個問題?

PHP與•奈特需要設置一些標題:

X-Requested-With:XMLHttpRequest 
Content-Type:application/x-www-form-urlencoded; charset=UTF-8 
+0

對我來說,目前還不清楚你想做什麼。 –

+0

我試圖澄清這個問題。 –

+0

對不起,這和以前一樣不清楚。 本文'我可以通過HttpRequest.postFormData對Map進行編碼。但JQuery post方法可以編碼Map '對我來說根本沒有意義。如果你可以編碼Map,通過HttpRequest.postFormData什麼**不**工作? –

回答

0

我已經有些髒速戰速決。不完整,未經測試,爲我工作:

Map<String, dynamic> data = {"actualTime": 1357089552, "events": [{"priceInsert": 1.32128, "priceExecution": 1.32128}]}; 
StringBuffer urlData = new StringBuffer(""); 
bool first = true; 
void urlEncode(dynamic sub, String path){ 
    if(sub is List){ 
     for(int i = 0;i<sub.length;i++){ 
     urlEncode(sub[i], "$path%5B$i%5D"); 
     } 
    }else if(sub is Map){ 
     sub.forEach((k,v){ 
     if(path == ""){ 
      urlEncode(v, "${Uri.encodeQueryComponent(k)}"); 
     }else{ 
      urlEncode(v, "$path%5B${Uri.encodeQueryComponent(k)}%5D"); 
     } 
     }); 
    }else{ 
     if(!first){ 
     urlData.write("&"); 
     } 
     first = false; 
     urlData.write("$path=${Uri.encodeQueryComponent(sub.toString())}"); 
    } 
} 
urlEncode(data, ""); 

HttpRequest xhr = new HttpRequest(); 
    xhr 
    ..open('POST', url) 
    ..onLoadEnd.listen((ProgressEvent event){/*handle success*/}, onError:(){/*handle error*/}) 
    ..setRequestHeader("X-Requested-With", "XMLHttpRequest") 
    ..setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") 
    ..send(urlData.toString());