Delphi. idHTTP. Post Отправляем русский текст и избавляемся от символов =’#$D#$A’ на сервере

Столкнулся со следующими проблемами.

Проблема 1. При отправке POST / GET запроса при помощи компонента idHTTP русские символы превращаются в вопросы

‘Русское слово’ превращается в ??????? Это можно увидеть при помощи анализатора HTTP трафика, либо непосредственно на сервере (у меня idHTTPServer).

Отправляю примерно так…

Решение первой проблемы есть в сети, но видимо оно подходило для предыдущих версий Delphi.

В частности, на королевстве Delphi, автор, столкнувшийся с такой же проблемой решает её следующим образом

И утверждает, что StringStream решает эту проблему. Я попробовал этот рецепт и он у меня не сработал, вызывая AV. Возможно я что-то не так сделал, возможно ошибка в версиях. Долго не стал разбираться.

Мое решение №1 – просто сменить кодировку по умолчанию для idHTTP

изменить кодировку по умолчанию у компонента idHTTP

89

Более подробно на официальном форуме Embarcadero

Мое решение №2 кодировать и декодировать запрос, если клиент и сервер наши

Этот путь, наилучший, на мой взгляд. Но только при условии, что сервер наш.

Пошёл другим путём. Решил воспользоваться модулем System.NetEncoding, доступным, начиная с Delphi XE7 и кодировать / декодировать отправляемые значения при помощи следующих методов.

На клиенте кодируем

На сервере декодируем

В приницпе, это дало нужный эффект, но тут вмешалась другая проблема

Проблема 2. При раскодировании потока(Stream) на сервере idHTTPServer в произвольном порядке добавляется сочетание =’#$D#$A’ и похожие сочетания

Тут под декодированием я понимаю декодирование потока.Декодирую поток так, как описано в предыдущем посте

Как отправить POST запрос, принять и декодировать его на idHTTPServer?

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

Под пробелами я понимаю символы ‘#$D#$A’. Я так понимаю, это делается на сервере автоматически.

Обратите внимание, словосочетание ‘Русское слово’ после TNetEncoding.URL.Encode на клиенте будет выглядеть так

А после того как входящий поток на сервере будет обработан, оно будет выглядеть вот так

Соответственно, чтобы применить способ декодирования

Нам нужно для начала избавиться от лишних символов.

Я сделал это следующим образом

В результате ‘Русское слово’ дошло до сервера в неизменном, первоначальном виде.

69

Финальный код получения параметров с учетом этих моментов у меня получился таким

 

This entry was posted in Delphi. Bookmark the permalink.