Сервер ОТДЫХА Дельфи, Клиент Android, использующий сжатие

Мы строим сервер ОТДЫХА Дельфи, который подает довольно большие куски данных (1.5 МБ за запрос, из которых есть многие) к родному применению Android. Все хорошо работает, кроме размеров данных в этом случае будет проблематично, вызывая долгие времена передачи в нашей среде (ограниченные показатели мобильных данных). Я попытался добавить ZLibCompression фильтр на DSHTTPWebDispatcher , но ответ только возвращается снова как несжатый текст/HTML.

Там какой-либо путь состоит в том, чтобы вынудить сервер использовать фильтр, добавленный в качестве события перед отправкой?

Сервер строится, используя Delphi XE3.

1
nl ja de
можно ли также показать код Android клиентской стороны?
добавлено автор mjn, источник
какова принятый закодированная стоимость заголовка для ваших запросов?
добавлено автор jachguate, источник
как делают вы посылаете данные (фирма метода)?
добавлено автор jachguate, источник
Спасибо за вопросы... действительно не имеет значения, кто клиент, это должно быть потребляемым применениями в любом OS. Проблема здесь должна была заставить фактическое сжатие работать во-первых, и также устанавливать тип контента правильно. Я с тех пор понял его и объявлю результат здесь вскоре.
добавлено автор bosvos, источник

1 ответы

Мне удалось выяснить, где добавить сжатие и соответствующие изменения заголовка в проекте DataSnap.

Ключ здесь - класс TWebModule. При использовании волшебника, чтобы создать новый проект, реализация по умолчанию класса TWebModule построена, со свойствами событий для BeforeDispatch, AfterDispatch и т.д. Обозначение здесь относится к действию посылки входящего запроса туда, где это будет обработано. Так, BeforeDispatch происходит, когда запрос прибывает, некоторая обработка происходит на сервере и спусковых механизмах AfterDispatch непосредственно перед тем, как ответ передают обратно посетителю.

AfterDispatch - поэтому правильное событие, чтобы использовать, если вы хотите изменить построенный ответ после факта. Это может включать изменения и содержания и заголовков.

На событии AfterDispatch:

procedure TWebModule1.WebModuleAfterDispatch(
  Sender: TObject;
  Request: TWebRequest; 
  Response: TWebResponse;
  var Handled: Boolean);
var

srcbuf, destbuf : TBytes;
str : string;

begin
  str := Response.Content;

  //prepare byte array
  srcbuf := BytesOf(str);

  //compress to buff (System.ZLib)
  ZCompress(srcbuf, destbuf, zcMax);

  //prepare responsestream and set content encoding and type
  Response.Content := '';
  Response.ContentStream := TMemoryStream.Create;
  Response.ContentEncoding := 'deflate';
  Response.ContentType := 'application/json';

  //current browser implementations incorrectly handles the first 2 bytes 
  //of a ZLib compressed stream, remove them
  Response.ContentStream.Write(@(destbuf[2]),length(destbuf)-2);
  Response.ContentLength := (length(destbuf))-2;
end;

Не очень необычный, можно было позволить/отключить сжатие в зависимости от переданного обратно содержания, но для нашего внедрения мы сохраняли его простым.

Это работает 100% со Скрипачом и браузерами, которые могут обращаться, выкачивают.

0
добавлено
Delphi & Lazarus
Delphi & Lazarus
274 участник(ов)

Чат про Delphi и Lazarus