2012-07-24 16 views
0

我使用Indy做短信到短信服務,將發送短信,但短信文本結束在我的手機%20而不是空格,這裏是代碼:HTTP發短信到短信服務獲取%20文本德爾福2007年

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

您需要解碼消息。請參閱http://stackoverflow.com/questions/1657105/delphi-html-decode – 2012-07-24 23:48:32

+1

您認爲需要解碼的問題HTML中的@Tim在哪裏? – 2012-07-25 02:22:49

回答

3

TStrings版本的TIdHTTP.Post()發送application/x-www-form-urlencoded請求到服務器。發佈的數據默認爲網址編碼。服務器在處理之前需要對發佈的數據進行解碼。這聽起來像服務器端代碼沒有做到這一點。您可以從TIdHTTP.HTTPOptions屬性中刪除hoForceEncodeParams標誌以禁用發佈數據的url編碼,但我建議您將錯誤報告給Tropo,以便他們可以修復其服務器端代碼。

+0

這樣做了,我通知Tropo,謝謝。 – 2012-07-25 22:55:54

0

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。