0

我正在使用 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);

谢谢

4

2 回答 2

3

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

于 2012-07-25T00:03:18.567 回答
0

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

在 Indy 10 中,您可以使用 TIdFormDataField.Charset 属性指定如何将字符串转换为字节,然后使用 TIdFormDataField.ContentTransfer 属性指定如何对字节进行编码。对于 ContentTransfer,您可以指定 '7bit'、'8bit'、'binary'、'quoted-printable'、'base64' 或空白字符串(相当于 '7bit',但在 MIME 中没有说明标题)。

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

或者,使用 TIdMultipartFormDataStream.AddFormField() 的 TStream 重载版本而不是 String 重载版本,然后您可以根据需要将数据存储在输入 TStream 中,并将根据 TIdFormDataField.ContentTransfer 的值按原样编码财产。这应该删除你得到的 %20 。

于 2012-07-25T07:03:41.557 回答