Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.01.25;
Скачать: CL | DM;

Вниз

Unzip SOAP response   Найти похожие ветки 

 
amelnyk ©   (2010-05-20 15:43) [0]

Всем привет!
Думал довольно стандартная ситуация, но запнулся и уже совсем измотался в поиске...

Есть приложение, работающее по SOAP (через импортированный wsdl). Стала задача использовать зипование для SOAP ответов.
Я добавил заголовок ко всем запросам - "Accept-Encoding: gzip". Да, теперь получаю респонсы в зипованном виде...
Но тут стала проблемка...
Delphi при попытке распарсить зипованный ответ, выдаёт эксепшн:
An invalid character was found in text content.
Line: 1

Вылетает именно при вызове метода удаленного интерфейса, я сам с этим зипованным ответом еще не успеваю ничего сделать. Как распаковать ответ до его обработки?

Подскажите куда копать...


 
amelnyk ©   (2010-05-21 17:58) [1]

Родил решение). Может кому еще будет полезно...
Создаю класс наследник THTTPReqResp, в котором переопределен метод Receive:

[CODE=pas] TMyHTTPReqResp = class(THTTPReqResp)
   public
     procedure Receive(Context: Integer; Resp: TStream; IsGet: Boolean);override;
 end;[/CODE]

Сам метод выглядит примерно так:

////////////////////////////////////////////////////////////////////////////////

[CODE=pas]procedure TMyHTTPReqResp.Receive(Context: Integer; Resp: TStream; IsGet: Boolean);
var
 outStream    : TMemoryStream;
 contEncoding : string;
 size         : DWord;
 index        : DWord;
begin
 inherited;

 try
   size := 20;
   index := 0;
   SetLength(contEncoding, size);
   //проверяем есть ли заголовок Content-Encoding
   if not HttpQueryInfo(Pointer(Context), HTTP_QUERY_CONTENT_ENCODING, @contEncoding[1], size, index) then
     Exit;

   //если есть, то смотрим стоит ли там gzip
   if Pos("gzip", contEncoding) = 0 then
     Exit;

   //если gzip, то разархивировываем и копируем в возвращаемый стрим
   Resp.Position := 0;
   outStream := TMemoryStream.Create;
   try
     GZDecompressStream(Resp, outStream);

     Resp.Position := 0;
     Resp.CopyFrom(outStream, 0)
   finally
     outStream.Free;
   end;
 except

 end;
end;[/CODE]

Где метод GZDecompressStream взят из либы Zlib, скачанной для Delphi 2009 отсюда: http://www.base2ti.com/zlib.htm
А то с родным ZLib че-то не сложилось, не хотел он распаковывать.



Страницы: 1 вся ветка

Текущий архив: 2015.01.25;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.006 c
15-1403446108
Timer
2014-06-22 18:08
2015.01.25
Посоветуйте аудио-плеер


2-1387655618
Alen
2013-12-21 23:53
2015.01.25
База данных


6-1274355825
amelnyk
2010-05-20 15:43
2015.01.25
Unzip SOAP response


2-1388310005
Jimmy
2013-12-29 13:40
2015.01.25
Отключение Item у ComboBox


3-1302158824
OW
2011-04-07 10:47
2015.01.25
Почему дольше стало выполняться? oracle