2017-06-20 8 views
0

メールサービスのWebサービスにアクセスする小さなプログラムを作成しました。同じコードは、インディ9とデルファイ7で動作しますが、インディ10送信パラメータとしてTStringListを使用したIndy HTTP投稿でエラーが発生しました

とデルファイシアトルで動作しません 私の文字列リストがそのように構築されて

ParametrosConsulta.Values['nCdEmpresa'] := Edt_Cod.Text; 
    ParametrosConsulta.Values['&sDsSenha'] := Edt_Sen.Text; 
    ... 

私のポストを送信パラメータSTRINGLISTを持っています、これは持っているようなテキスト:その後、

nCdEmpresa= &sDsSenha= &nCdServico=41106&sCepOrigem=88905355&sCepDestino=88906768&nVlPeso=20.0&nCdFormato=1&nVlComprimento=20.0&nVlAltura=20.0&nVlLargura=20.0&nVlDiametro=6.0&sCdMaoPropria=N&nVlValorDeclarado=0&sCdAvisoRecebimento=N 

は私が以前に示されたテキストを保持するParametroConsulta、そのようidHttp.Postを呼び出し、Respostaは、要求の応答を保持しているTStringStreamです:

IdHttp.Request.Clear; 
    IdHttp.Request.Host := 'ws.correios.com.br'; 
    IdHttp.Request.ContentType := 'application/x-www-form-urlencoded'; 
    idHTTP.Request.UserAgent := 'Mozilla/3.0 (compatible;Indy Library)'; 
    IdHTTP.Request.Charset := 'utf-8'; 
    IdHTTP.ProtocolVersion := pv1_1; 
    {...} 
    try 
     Application.ProcessMessages; 
     FrmPrincipal.Refresh; 
     IdHttp.Post('http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx/CalcPrecoPrazo', ParametrosConsulta, Resposta); 
    except 
     on E:EIdHttpProtocolException do 
     begin 
     ShowMessage(E.Message + ' - ' + E.ErrorMessage); 
     PnlEnviando.Visible := False; 
     Exit; 
     end; 
    end; 

しかし、投稿後、sDsSenhaが欠落しています(このパラメータには空白を入れることができます)。

+0

どのようにパラメータコレクションを作成しますか? 'DelimitedText'を通して? – Victoria

+0

@Victoriaキーと値を使用しています – William

+2

'&' charを使わないでください。 Indyはあなたのためにパラメータを連結します。 – Victoria

答えて

3

&を記述しないでください:

ParametrosConsulta.Values['sDsSenha'] := Edt_Sen.Text; 

アンパサンドは、自動的にインディで追加されています。 Btwの場合、一部の文字のエスケープにはTIdURI.PathEncode(Edt_Sen.Text)を使用する必要があります。

+1

パラメータをエンコードする必要はありません。彼らがコレクションに入る間、彼らはIndyによってコード化されます。 – Victoria

+0

はい、それを忘れました。 –

+0

@Victoria: 'hoppceEncodeParams'フラグが' TIdHTTP.HTTPOptions'プロパティ(デフォルトでは)で有効になっている場合のみです。 –

関連する問題