0

SMS を送信する SMS サービスに投稿するために Indy を使用していますが、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自体は、投稿されたデータにquoted-printableエンコーディングを適用しないため、投稿されるデータは、事前にquoted-printableエンコードする必要があります。

Indy 10では、TIdFormDataField.Charsetプロパティを使用して文字列をバイトに変換する方法を指定してから、TIdFormDataField.ContentTransferプロパティを使用してバイトのエンコード方法を指定できます。ContentTransferの場合、「7bit」、「8bit」、「binary」、「quoted-printable」、「base64」、または空白の文字列(「7bit」と同等ですが、MIMEに多くを記載せずに)を指定できます。ヘッダ)。

TIdFormDataField.CharSetプロパティを、OSが使用しているものと一致する文字セットに設定してから、TIdFormDataField.ContentTransferプロパティを「8bit」に設定します。

または、Stringオーバーロードバージョンの代わりにTIdMultipartFormDataStream.AddFormField()のTStreamオーバーロードバージョンを使用すると、入力TStreamに任意の方法でデータを格納でき、TIdFormDataField.ContentTransferの値に基づいてそのままエンコードされます。財産。これにより、取得している%20が削除されます。

于 2012-07-25T07:03:41.557 に答える