Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.17.150.163] |
|
Сообщ.
#1
,
|
|
|
Пришел момент перевода своего приложения с локального на клиент-сервер
В чём нужна подсказка: Нужно на http обмениваться инфой между клиентом и сервером, желательно с использованием XML, так как его проще обрабатывать и через него я могу передать то количество параметров что мне нужно. Всё ничего, но возникла проблема с кирилицей... Ответ сервера в кирилице я нашел как сделать: 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 - сервер |
Сообщ.
#2
,
|
|
|
Самое главное: не надо собирать XML вручную - только через TXMLDocument или его аналог.
Например, так неправильно: 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 |
Сообщ.
#3
,
|
|
|
Для начала я бы порекомендовал применять utf8, национальные кодировки отмирают.
Во-вторых, content-type в заголовке http ответа и кодировка xml - это две абсолютно разные и совершенно независимые штуки. Более того, значение атрибута encoding документа xml не означает, что сам документ в этой кодировке. Поэтому сниффер в руки и смотреть, что отправляется и получается |
Сообщ.
#4
,
|
|
|
Цитата Fr0sT @ Более того, значение атрибута encoding документа xml не означает, что сам документ в этой кодировке. Вот как раз это бывает, если собирать контент руками. Тогда парсеры XML спотыкаются. |
Сообщ.
#5
,
|
|
|
Отправляю
var zap:tstringlist; ... begin zap.Add('p1=параметр'); IDHTTP1.Post(adr, zap); ... смотрю HTTP analizer V7 Там видно P1 и значение параметр Принимаю procedure TForm1.IDHTTPserverCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); begin ARequestInfo.ContentEncoding:='text/html; charset=windows-1251'; // это чтобы на руссок отвечало. Работает memo1.Text:=ARequestInfo.Params.Text; ... и полученый текст в мемо... p1=паÑамеÑÑ Как ЭТО победить? |
Сообщ.
#6
,
|
|
|
С отправкой на сервер проблему решил, сервер теперь принимает русские символы
IDHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; IDHTTP.Request.Charset := 'utf-8'; ... далее отправляю запрос но появилась проблема в ответе. Если ранее я ставил в настройках сервера AResponseInfo.ContentType := 'text/html; charset=windows-1251'; // для русских ответов и клиент нормально принимал русский, то сейчас сервер принимает всё нормально, а вот клиент принимает ????? вместо AResponseInfo.ContentText :='ответ'; Как это решить? |
Сообщ.
#7
,
|
|
|
Победил
Кому нужно через IDHTTP отправлять запрос и принимать его с помощью IDHTTPserver и при этом использовать русский IDHTTP перед отправкой запроса IDHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; IDHTTP.Request.Charset := 'utf-8'; ... IDHTTPserver перед отправкой ответа AResponseInfo.ContentType:='application/x-www-form-urlencoded'; AResponseInfo.CharSet:='utf-8'; ... Только так нормально отправляет русский запрос и ответ |
Сообщ.
#8
,
|
|
|
Молодец! Продираясь через тернии, самостоятельно открыл то, что я давно посоветовал в #3. Что ж, личный опыт всегда лучше усваивается, чем советы
|