На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

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

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> Пример http клиент-сервера с поддержкой кирилицы
    Пришел момент перевода своего приложения с локального на клиент-сервер
    В чём нужна подсказка:
    Нужно на http обмениваться инфой между клиентом и сервером, желательно с использованием XML, так как его проще обрабатывать и через него я могу передать то количество параметров что мне нужно. Всё ничего, но возникла проблема с кирилицей... Ответ сервера в кирилице я нашел как сделать:
    ExpandedWrap disabled
      procedure TForm1.hts1CommandGet(AContext: TIdContext;
        ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
      begin
        AResponseInfo.ContentType := 'text/html; charset=windows-1251'; // для русских ответов
        ...
      end;

    и сервер клиенту отвечает правильно, но принять кирилицу не выходит...

    1) Как правильно отправить с помощью POST кирилицу, чтобы сервер её принял?
    2) Там ли я на сервере пытаюсь обработать POST запрос?


    delphi RAD Studio 10.2
    IDHTTP - клиент
    IDHTTPServer - сервер
      Самое главное: не надо собирать XML вручную - только через TXMLDocument или его аналог.

      Например, так неправильно:
      ExpandedWrap disabled
        var xml: string;
        xml = '<?xml version="1.0" encoding="windows-1251"?>' // руками указали processing instruction
            + '<tag-content>Тут русский текст</tag-content>'; // руками напихали контент, безотносительно processing instruction


      Дело в том, что XML - это не текст. Это байтовый поток, который для большинства случаев выглядит как текст. Но чуть шаг в сторону - надо руками энкодить в правильный байтовый формат или же использовать готовые энкодеры, как TXMLDocument (который, в свою очередь, лишь обёртка вокруг системного компонента MS XML).

      Вот ещё на эту тему:
      http://okitgo.ru/xml/kodirovka-xml.html
      Windows as usual - my "wau" Windows experience
        Для начала я бы порекомендовал применять utf8, национальные кодировки отмирают.
        Во-вторых, content-type в заголовке http ответа и кодировка xml - это две абсолютно разные и совершенно независимые штуки. Более того, значение атрибута encoding документа xml не означает, что сам документ в этой кодировке. Поэтому сниффер в руки и смотреть, что отправляется и получается
        Codero ergo sum
        // Программирую — значит, существую
          Цитата Fr0sT @
          Более того, значение атрибута encoding документа xml не означает, что сам документ в этой кодировке.

          Вот как раз это бывает, если собирать контент руками. Тогда парсеры XML спотыкаются.
          Windows as usual - my "wau" Windows experience
            Отправляю
            ExpandedWrap disabled
              var
              zap:tstringlist;
              ...
              begin  
              zap.Add('p1=параметр');
              IDHTTP1.Post(adr, zap);
              ...

            смотрю HTTP analizer V7
            Там видно P1 и значение параметр

            Принимаю
            ExpandedWrap disabled
              procedure TForm1.IDHTTPserverCommandGet(AContext: TIdContext;
                ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
              begin
              ARequestInfo.ContentEncoding:='text/html; charset=windows-1251'; // это чтобы на руссок отвечало. Работает
              memo1.Text:=ARequestInfo.Params.Text;


            ... и полученый текст в мемо... p1=параметÑ
            Как ЭТО победить?
              С отправкой на сервер проблему решил, сервер теперь принимает русские символы
              ExpandedWrap disabled
                IDHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
                IDHTTP.Request.Charset := 'utf-8';
                ... далее отправляю запрос


              но появилась проблема в ответе. Если ранее я ставил в настройках сервера
              ExpandedWrap disabled
                AResponseInfo.ContentType := 'text/html; charset=windows-1251'; // для русских ответов

              и клиент нормально принимал русский, то сейчас сервер принимает всё нормально, а вот клиент принимает ????? вместо
              ExpandedWrap disabled
                AResponseInfo.ContentText :='ответ';

              Как это решить?
                Победил
                Кому нужно через IDHTTP отправлять запрос и принимать его с помощью IDHTTPserver и при этом использовать русский
                IDHTTP перед отправкой запроса
                ExpandedWrap disabled
                  IDHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
                  IDHTTP.Request.Charset := 'utf-8';
                  ...


                IDHTTPserver перед отправкой ответа
                ExpandedWrap disabled
                  AResponseInfo.ContentType:='application/x-www-form-urlencoded';
                  AResponseInfo.CharSet:='utf-8';
                  ...


                Только так нормально отправляет русский запрос и ответ
                  Молодец! Продираясь через тернии, самостоятельно открыл то, что я давно посоветовал в #3. Что ж, личный опыт всегда лучше усваивается, чем советы
                  Codero ergo sum
                  // Программирую — значит, существую
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script Execution time: 0,1238 ]   [ 18 queries used ]   [ Generated: 13.11.19, 05:28 GMT ]