Открыть список
Как стать автором
Обновить

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

Чулан
В процессе разработки у меня стояла задача найти способ получать бинарные данные от сервера через 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
Теги:as3flashflexactionscriptactionscript 3.0HTTPServiceBinaryHTTPService
Хабы: Чулан
Всего голосов 13: ↑8 и ↓5 +3
Просмотры206

Комментарии 5

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Похожие публикации

Программист 1С
от 90 000 ₽У ПалычаСамараМожно удаленно
Senior Angular Frontend (удаленно, продуктовая команда)
от 200 000 до 260 000 ₽Nimbus WebМожно удаленно
Frontend Developer (Vue.js)
от 130 000 до 190 000 ₽YoupsМоскваМожно удаленно
Frontend developer
от 100 000 ₽АДВАМожно удаленно
Программист 1С
от 100 000 до 150 000 ₽ТаймЛизингНовосибирск

Лучшие публикации за сутки