我希望通过HTTP传输post请求,正文需要包含我已经创建的ValueObject的信息。基本上我需要序列化对象(具有多个维度)。我遇到的问题是我不想将数据作为JSON或XML传输,而是作为多维数组传输。它适用于HTML表单,如:
数据:
Array
(
[a] => Array
(
[a] => Array
(
[1] => abcd
)
[b] => defg
)
[d] => ghij
)
请求正文(已解码):
a[a][1]=abcd&a[b]=defg&d=ghij
那里有没有可以进行这种序列化的库吗?我正在使用as3httpclientlib,所以我没有mx.rpc系列的便利。我花了几个小时试图推出自己的解决方案,但我很确定我会因为有人花更多时间和思考的解决方案而变得更好。
答案 0 :(得分:0)
您可以尝试AMF来解决您的问题(根据您的编程语言,您有不同的库)。 主要优点是您可以将对象映射到对象(使用值对象)并保留数据类型(如数组)。
我正在使用插件amf和Symfony,以下是返回数据的示例:
SabreAMF_TypedObject对象 ( [amfClassName:private] =>产品
[amfData:private] => Array
(
[code] => 1970A007
[designation] => 1970 PELL A007 BLANC
[description] => Vernis extra souple extra brillant
[sommeil] =>
[name] => 1970
[base] => A Stretch Enduit
[composition] => 43% PL 57% PU
[laize] => 137-140 cm
[weight] => 588 g/ml
[dechirure] => 10 daN/9 daN
[abrasion] => 5000
[xenotest] => 4/5
[non_feu] => Non
[Color] => SabreAMF_TypedObject Object
(
[amfClassName:private] => Color
[amfData:private] => Array
(
[id] => 124
[name] => BLANC
)
)
一些解释:
[amfClassName:private] => Product
输入我的对象。 As3方面我有一个产品价值对象,它包含数组属性,如“代码”,“指定”,“描述”,......和颜色(另一种带有值对象颜色的类型数组)
所以你可以轻松拥有一个多维结构数组......
答案 1 :(得分:0)
确定,
所以这里使用URLVariables更简单:
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
public class URLVariableExample extends Sprite {
private static const URL_SERVER:String = "http://localhost/testURL.php";
private var loader:URLLoader;
public function URLVariableExample() {
init();
}
private function init() : void {
var request:URLRequest = new URLRequest(URL_SERVER);
var urlVar:URLVariables = new URLVariables();
var a : Array = ["toto", "titi", "loulou"];
urlVar["urlTest[a][a]"] = a.toString();
urlVar["urlTest[a][b]"] = "desc";
urlVar["urlTest[d]"] = "defg";
request.data = urlVar;
request.method = URLRequestMethod.POST;
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, loaderComplete);
loader.load(request);
}
private function loaderComplete(event : Event) : void {
loader.removeEventListener(Event.COMPLETE, loaderComplete);
trace(URLLoader(event.currentTarget).data);
}
}
}
我请求了一个php文件,只是放了一个简单的var_dump函数。 跟踪返回:
array(2) {["d"]=>string(4) "defg"["a"]=> array(2) {["a"]=>string(16) "toto,titi,loulou["b"]=>string(4) "desc"}}
答案 2 :(得分:0)
var url:String = 'http://localhost/dump.php';
var params:Object = {
test: 'ok',
nested_1: {
nested_2: {
nested_3: {
nested_4: {
hello: 'mf',
str: '~!@#$%^&*()_+'
}
}
}
},
};
var request:URLRequest = new URLRequest(url);
var variables:URLVariables = new URLVariables();
parameters = fixParameters(parameters || {});
for (var key:String in parameters) {
variables[key] = parameters[key];
}
request.data = variables;
var loader:URLLoader = new URLLoader();
loader.load(request);
这里是fixParameters方法
private function fixParameters(data:Object, parameters:Object = null, prefixes:Array = null):Object {
var setPrefix:Array;
var prefixKey:String;
if (!parameters) {
parameters = {};
}
if (!prefixes) {
prefixes = [];
}
for (var key:String in data) {
setPrefix = prefixes.concat([key]);
if (typeof(data[key]) == 'object') {
parameters = fixParameters(data[key], parameters, setPrefix);
} else {
prefixKey = '';
for (var i:Number = 0; i < setPrefix.length; i++) {
prefixKey += i == 0 ? setPrefix[i] : '[' + setPrefix[i] + ']';
}
parameters[prefixKey] = data[key];
}
}
return parameters;
}