HTTP Post text to SMS service получает %20 в тексте Delphi 2007

Я использую Indy, чтобы отправить сообщение в службу SMS, которая отправит SMS, но текст SMS заканчивается на моем телефоне с% 20 вместо пробелов, вот код:

url,text:string;
IdHTTP1: TIdHTTP;
IdSSLIOHandlerSocketOpenSSL2: TIdSSLIOHandlerSocketOpenSSL;
 begin    
    IdSSLIOHandlerSocketOpenSSL2 := TIdSSLIOHandlerSocketOpenSSL.Create;
    IdHTTP1 := TIdHTTP.Create;
    IdSSLIOHandlerSocketOpenSSL2.SSLOptions.Method := sslvSSLv23;
    IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL2;
    IdHTTP1.HandleRedirects := true;
    IdHTTP1.ReadTimeout := 5000;
    param:=TStringList.create;
    param.Clear;
    param.Add('action=create');
    param.Add('token=' + SMSToken);
    param.Add('to=' + Phone);
    param.Add('msg=' + MessageText);
    url:='https://api.tropo.com/1.0/sessions';
    try
       text:=IdHTTP1.Post(url, param);

Спасибо


person Kim HJ    schedule 24.07.2012    source источник
comment
Вам нужно расшифровать сообщение. См. stackoverflow.com/questions/1657105/delphi-html-decode.   -  person Tim S    schedule 25.07.2012
comment
Где в этом вопросе HTML, который, по вашему мнению, нужно расшифровать, @Tim?   -  person Rob Kennedy    schedule 25.07.2012


Ответы (2)


TStrings версия TIdHTTP.Post() отправляет application/x-www-form-urlencoded запрос на сервер. По умолчанию публикуемые данные кодируются в URL-адресе. Сервер должен декодировать отправленные данные перед их обработкой. Похоже, код на стороне сервера делает это неправильно. Вы можете удалить флаг hoForceEncodeParams из свойства TIdHTTP.HTTPOptions, чтобы отключить URL-кодирование публикуемых данных, но я бы посоветовал вам вместо этого сообщить об ошибке в Tropo, чтобы они могли исправить свой код на стороне сервера.

person Remy Lebeau    schedule 25.07.2012
comment
Это сделало это, и я сообщил Tropo, спасибо. - person Kim HJ; 26.07.2012

Сам TIdHTTP не применяет кодировку для печати в кавычках к публикуемым данным, поэтому публикуемые данные должны быть предварительно закодированы в кавычках.

В Indy 10 вы можете использовать свойство TIdFormDataField.Charset, чтобы указать, как строки преобразуются в байты, а затем использовать свойство TIdFormDataField.ContentTransfer, чтобы указать, как кодируются байты. Для ContentTransfer вы можете указать «7bit», «8bit», «binary», «quoted-printable», «base64» или пустую строку (что эквивалентно «7bit», но без указания этого в MIME). заголовок).

Задайте для свойства TIdFormDataField.CharSet кодировку, соответствующую используемой вашей ОС, а затем установите для свойства TIdFormDataField.ContentTransfer значение «8bit».

В качестве альтернативы используйте перегруженную версию TStream TIdMultipartFormDataStream.AddFormField() вместо перегруженной версии String, тогда вы можете хранить данные во входном TStream любым удобным для вас способом, и они будут закодированы как есть на основе значения TIdFormDataField.ContentTransfer имущество. Это должно удалить% 20, которые вы получаете.

person Glen Morse    schedule 25.07.2012