2017-06-20 58 views
0

我創建了一個訪問郵件服務web服務的小程序。相同的代碼工作德爾福7印9,但並不可與德爾福西雅圖與印10在使用TStringList作爲發送參數的Indy HTTP post上的錯誤

我的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; 

但發佈後,web服務返回缺少sDsSenha(該參數可以容納一個空的空間)。

+0

如何構建參數集合?通過'DelimitedText'? – Victoria

+0

@維多利亞我使用的鍵和值 – William

+2

不要使用'&'字符。 Indy爲你連接參數。 – Victoria

回答

3

不要寫&

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

和號被印自動添加。 順便說一句,你可能需要使用TIdURI.PathEncode(Edt_Sen.Text)轉義某些字符。

+1

您不需要編碼參數。只要他們進入收藏,他們將由Indy編碼。 – Victoria

+0

是的,忘了那個。 –

+0

@Victoria:只有在'TIdHTTP.HTTPOptions'屬性(默認情況下)中啓用'hoForceEncodeParams'標記。 –