HTTP Post文本到SMS服务获得文本Delphi 2007中的%20

时间:2012-07-24 23:45:29

标签: delphi http indy10

我正在使用Indy发送短信服务来发送短信,但短信文本最终在我的手机上以%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);

感谢

2 个答案:

答案 0 :(得分:3)

TStrings TIdHTTP.Post()版本的application/x-www-form-urlencoded会向服务器发送hoForceEncodeParams个请求。发布的数据默认为url编码。服务器需要在处理之前解码发布的数据。听起来服务器端代码没有正确执行。您可以从TIdHTTP.HTTPOptions属性中删除{{1}}标志以禁用发布数据的url编码,但我建议您将错误报告给Tropo,以便他们可以修复服务器端代码

答案 1 :(得分:0)

TIdHTTP本身不会对发布的数据应用带引号的可打印编码,因此发布的数据必须事先进行引用打印编码。

在Indy 10中,您可以使用TIdFormDataField.Charset属性指定字符串如何转换为字节,然后使用TIdFormDataField.ContentTransfer属性指定字节的编码方式。对于ContentTransfer,您可以指定“7bit”,“8bit”,“binary”,“quoted-printable”,“base64”或空白字符串(与“7bit”等效,但在MIME中没有说明多少)头)。

将TIdFormDataField.CharSet属性设置为与您的操作系统使用的字符匹配的字符集,然后将TIdFormDataField.ContentTransfer属性设置为“8bit”。

或者,使用Tdream重载版本的TIdMultipartFormDataStream.AddFormField()而不是String重载版本,然后您可以按照您希望的方式将数据存储在输入TStream中,并且它将根据其值进行编码。 TIdFormDataField.ContentTransfer属性。这应该删除你得到的%20。