我正在使用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);
感谢
答案 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。