Apache flex 在Flex中的HTTP Post中上载任意数据

Apache flex 在Flex中的HTTP Post中上载任意数据,apache-flex,actionscript-3,http,post,Apache Flex,Actionscript 3,Http,Post,我们目前有一个Java小程序,它可以生成大量数据并上传到我们的服务器。我们拥有的上传方法之一是使用HTTP POST到我们的服务器,其内容只是原始数据(没有多部分编码或其他内容) 我正在考虑实现一个Flex应用程序来做同样的事情,但是我没有看到一种复制网络行为的方法。Flex中所有与HTTP相关的网络类似乎都是在假设您只是发出请求的情况下工作的。我看不到一种方法来实际设置POST的有效负载(除了设置几个查询参数,这在这里不起作用) 我真正想要的是能够启动一个HTTP POST,然后能够像套接字一

我们目前有一个Java小程序,它可以生成大量数据并上传到我们的服务器。我们拥有的上传方法之一是使用HTTP POST到我们的服务器,其内容只是原始数据(没有多部分编码或其他内容)

我正在考虑实现一个Flex应用程序来做同样的事情,但是我没有看到一种复制网络行为的方法。Flex中所有与HTTP相关的网络类似乎都是在假设您只是发出请求的情况下工作的。我看不到一种方法来实际设置POST的有效负载(除了设置几个查询参数,这在这里不起作用)

我真正想要的是能够启动一个HTTP POST,然后能够像套接字一样写入连接。不必在Socket类之上编写自己的HTTP实现,这是可能的吗?有没有办法在Flex中设置HTTP POST的有效负载


澄清:能够创建一个数据缓冲区并将其发送到服务器就足够了(看起来这是可能的)。如果我可以将连接视为一个套接字并随时间向其发送数据,而不是一次发送所有数据,那会更好,但这并不是严格要求的。

听起来你好像在问两个问题。是的,有一种方法可以在Flex中设置HTTP POST的有效负载,并将任何格式的文件上载到服务器:

private function doPost():void
{
    var yourData:ByteArray = new ByteArray();
    var encoder:Base64Encoder = new Base64Encoder();

    for (var i:int = 0; i < 10000; i++)
        yourData.writeByte(i);

    yourData.position = 0;
    encoder.encodeBytes(yourData);

    var req:URLRequest = new URLRequest("http://yourdomain.com/yourservice.ext");
    req.method = URLRequestMethod.POST;

    var postData:URLVariables = new URLVariables();
    postData.userData = encoder.flush();

    req.data = postData;

    var loader:URLLoader = new URLLoader();
    loader.dataFormat = URLLoaderDataFormat.BINARY;
    loader.addEventListener(Event.COMPLETE, loader_complete);
    loader.load(req);
}

private function loader_complete(event:Event):void
{
    trace("Upload complete!");
}
私有函数doPost():void
{
var yourData:ByteArray=newbytearray();
var编码器:Base64Encoder=新的Base64Encoder();
对于(变量i:int=0;i<10000;i++)
yourData.writeByte(i);
yourData.position=0;
encoder.encodeBytes(您的数据);
var req:URLEQUEST=新的URLEQUEST(“http://yourdomain.com/yourservice.ext");
req.method=URLRequestMethod.POST;
var postData:URLVariables=新的URLVariables();
postData.userData=encoder.flush();
req.data=postData;
变量加载器:URLLoader=新的URLLoader();
loader.dataFormat=URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE,loader_COMPLETE);
加载程序(req);
}
私有函数加载程序_完成(事件:事件):无效
{
跟踪(“上传完成!”);
}

。。。但这听起来也像是你想要连接,保持连接打开,然后“像插座一样”任意写入;如果是这样的话,那么除了使用Socket类之外,我不相信有内置的机制,不。希望它能有所帮助

我查看了URLRequest文档。使用URL变量有什么好处?文档似乎建议您只需执行req.data=yourData,它就会工作。区别是什么?取决于你将如何阅读发布的数据。上面,我只是假设通常的场景,其中一些页面按名称接收字节(例如,Request.Form[“userData”]等);URL变量只是让这更容易。但我不认为这是必须的,不,我只是一直在用它,没有名字。它被视为原始数据流。因此,如果我理解正确,我需要直接将数据设置为字节数组,而不是使用URLVariables,对吗?没错。查看文档——URLLoader.data属性:“URLRequest API提供二进制POST支持[…]如果对象是ByteArray对象,则ByteArray对象的二进制数据用作POST数据。”这对您来说应该很好。