Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2015.01.25;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





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


2-1388401221
Вопрошающий
2013-12-30 15:00
2015.01.25
E2089 Invalid typecast


15-1402790532
Пит
2014-06-15 04:02
2015.01.25
Термодинамика отдельно взятого человека


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


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский