|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Unzip SOAP response
Всем привет!
Думал довольно стандартная ситуация, но запнулся и уже совсем измотался в поиске... Есть приложение, работающее по SOAP (через импортированный wsdl). Стала задача использовать зипование для SOAP ответов. Я добавил заголовок ко всем запросам - "Accept-Encoding: gzip". Да, теперь получаю респонсы в зипованном виде... Но тут стала проблемка... Delphi при попытке распарсить зипованный ответ, выдаёт эксепшн: An invalid character was found in text content. Line: 1 Вылетает именно при вызове метода удаленного интерфейса, я сам с этим зипованным ответом еще не успеваю ничего сделать. Как распаковать ответ до его обработки? Подскажите куда копать... |
#2
|
|||
|
|||
Родил решение). Может кому еще будет полезно...
Создаю класс наследник THTTPReqResp, в котором переопределен метод Receive: Код:
TMyHTTPReqResp = class(THTTPReqResp) public procedure Receive(Context: Integer; Resp: TStream; IsGet: Boolean);override; end; Сам метод выглядит примерно так: //////////////////////////////////////////////////////////////////////////////// Код:
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; Где метод GZDecompressStream взят из либы Zlib, скачанной для Delphi 2009 отсюда: http://www.base2ti.com/zlib.htm А то с родным ZLib че-то не сложилось, не хотел он распаковывать. Последний раз редактировалось Admin, 21.05.2010 в 20:07. |