Delphi 使用TStringList作为发送参数的Indy HTTP post出错

Delphi 使用TStringList作为发送参数的Indy HTTP post出错,delphi,indy,Delphi,Indy,我创建了一个访问邮件服务Web服务的小程序。同样的代码适用于Delphi7和Indy9,但不适用于Delphi西雅图和Indy10 我的Stringlist就是这样构建的: ParametrosConsulta.Values['nCdEmpresa'] := Edt_Cod.Text; ParametrosConsulta.Values['&sDsSenha'] := Edt_Sen.Text; ... 我的帖子有一个发送参数stringlist,其文本如下: n

我创建了一个访问邮件服务Web服务的小程序。同样的代码适用于Delphi7和Indy9,但不适用于Delphi西雅图和Indy10

我的Stringlist就是这样构建的:

  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
然后我像那样调用idHttp.Post,它
ParametroConsulta
保存我之前显示的文本,
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;

但是在post之后,Web服务返回缺少的
sDsSenha
(此参数可能包含一个空白)

不要写
&

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

印地自动添加符号和。顺便说一句,您可能需要使用
TIdURI.pathcode(Edt_Sen.Text)
来转义某些字符。

不要写入
&

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

印地自动添加符号和。顺便说一句,您可能需要使用
TIdURI.pathcode(Edt_Sen.Text)
来转义某些字符。

如何构建参数集合?通过
DelimitedText
?@Victoria我正在使用key和value不使用
&
char。Indy为您连接参数。如何构建参数集合?通过
DelimitedText
?@Victoria我正在使用key和value不使用
&
char。Indy为您连接参数。您不需要对参数进行编码。只要它们进入集合,它们就会被Indy编码。是的,忘了这一点。@Victoria:只有在
TIdHTTP.HTTPOptions
属性(默认情况下)中启用了
hoForceEncodeParams
标志时,才需要对参数进行编码。只要它们进入集合,它们就会被Indy编码。是的,忘了这一点。@Victoria:只有在
TIdHTTP.HTTPOptions
属性中启用了
hoForceEncodeParams
标志时(默认情况下)。