Pull to refresh

BinaryHTTPService или как помочь HTTPService-у принимать ByteArray данные

Lumber room
В процессе разработки у меня стояла задача найти способ получать бинарные данные от сервера через HTTPService. Сам по себе HTTPService в mx пакете не позволяет получать результат в ByteArray. Это можно увидеть в классе mx.messaging.channels.DirectHTTPChannel в функции internalSend.

  1. package mx.messaging.channels
  2. {
  3. public class DirectHTTPChannel extends Channel
  4. {
  5. .....
  6. override protected function internalSend(msgResp:MessageResponder):void
  7. {
  8. var httpMsgResp:DirectHTTPMessageResponder = DirectHTTPMessageResponder(msgResp);
  9. var urlRequest:URLRequest;
  10. try
  11. {
  12. urlRequest = createURLRequest(httpMsgResp.message);
  13. }
  14. catch(e: MessageSerializationError)
  15. {
  16. httpMsgResp.agent.fault(e.fault, httpMsgResp.message);
  17. return;
  18. }
  19. var urlLoader:URLLoader = httpMsgResp.urlLoader;
  20. urlLoader.addEventListener(ErrorEvent.ERROR, httpMsgResp.errorHandler);
  21. urlLoader.addEventListener(IOErrorEvent.IO_ERROR, httpMsgResp.errorHandler);
  22. urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, httpMsgResp.securityErrorHandler);
  23. urlLoader.addEventListener(Event.COMPLETE, httpMsgResp.completeHandler);
  24. urlLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpMsgResp.httpStatusHandler);
  25. urlLoader.load(urlRequest);
  26. }
  27. .....
  28. }
  29. }

У URLLoader-а по умолчанию параметр dataFormat имеет значение URLLoaderDataFormat.TEXT, а для получение данных в виде ByteArray на нужен URLLoaderDataFormat.BINARY.

Всё делается очень просто. Первое, что нам нужно – это создать расширение для класса DirectHTTPChannel и установить у urlLoader-а параметр dataFormat=URLLoaderDataFormat.BINARY;
  1. public class DirectHTTPBinaryChannel extends DirectHTTPChannel
  2. {
  3. public function DirectHTTPBinaryChannel(id:String, uri:String="")
  4. {
  5. super(id, uri);
  6. }
  7. override protected function getMessageResponder(agent:MessageAgent,
  8. message:IMessage):MessageResponder
  9. {
  10. return new DirectHTTPBinaryMessageResponder(agent, message, this, new URLLoader());
  11. }
  12. override protected function internalSend(msgResp:MessageResponder):void
  13. {
  14. var httpMsgResp:DirectHTTPBinaryMessageResponder = DirectHTTPBinaryMessageResponder(msgResp);
  15. var urlRequest:URLRequest;
  16. try
  17. {
  18. urlRequest = createURLRequest(httpMsgResp.message);
  19. }
  20. catch(e: MessageSerializationError)
  21. {
  22. httpMsgResp.agent.fault(e.fault, httpMsgResp.message);
  23. return;
  24. }
  25. var urlLoader:URLLoader = httpMsgResp.urlLoader;
  26. urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
  27. urlLoader.addEventListener(ErrorEvent.ERROR, httpMsgResp.errorHandler);
  28. urlLoader.addEventListener(IOErrorEvent.IO_ERROR, httpMsgResp.errorHandler);
  29. urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, httpMsgResp.securityErrorHandler);
  30. urlLoader.addEventListener(Event.COMPLETE, httpMsgResp.completeHandler);
  31. urlLoader.load(urlRequest);
  32. }
  33. }

Для того чтобы мы могли использовать наш DirectHTTPBinaryChannel, создаем расширение класса HTTPService.
  1. public class BinaryHTTPService extends HTTPService
  2. {
  3. protected static var binaryChannel:Channel;
  4. protected static var binaryChannelSet:ChannelSet;
  5. public function BinaryHTTPService(rootURL:String = null, destination:String = null)
  6. {
  7. super(rootURL, destination);
  8. }
  9. override public function send(parameters:Object = null):AsyncToken
  10. {
  11. if (useProxy == false)
  12. {
  13. /* force the use of our binary channel */
  14. if (binaryChannelSet == null)
  15. {
  16. var dcs:ChannelSet = new ChannelSet();
  17. binaryChannel = new DirectHTTPBinaryChannel("direct_http_binary_channel");
  18. dcs.addChannel(binaryChannel);
  19. channelSet = dcs;
  20. binaryChannelSet = dcs;
  21. }
  22. else if (channelSet != binaryChannelSet)
  23. {
  24. channelSet = binaryChannelSet;
  25. }
  26. }
  27. return super.send(parameters);
  28. }
  29. }

Пример рабочих классов: BinaryHTTPService DirectHTTPBinaryChannel
Tags:as3flashflexactionscriptactionscript 3.0HTTPServiceBinaryHTTPService
Hubs: Lumber room
Rating +3
Views 206 Add to bookmarks 3
Comments
Comments 5

Popular right now

Frontend developer
from 100,000 ₽МамсиRemote job
Програмист 1С
from 130,000 to 160,000 ₽ОКРУГМоскваRemote job
Front-end разработчик
from 80,000 to 120,000 ₽Hunt4YouRemote job
Верстальщик
from 1,500 €TR LogicRemote job
Android разработчик (Kotlin) Middle+/Senior
from 130,000 to 270,000 ₽МТСМоскваRemote job

Top of the last 24 hours