2011-10-14 11 views
9

Sto riscontrando problemi con il servizio SES di Amazon tramite TIdHTTP di Indy.Problemi di posta con Indy TIdHTTP

Ecco un esempio di codice che sto usando:

procedure TMainFrm.btnAmazonSESClick(Sender: TObject); 
var 
    SSLHandler: TIdSSLIOHandlerSocket; 
    HttpClient: TIdHTTP; 
    Params: TStringStream; 
begin 
    SSLHandler := TIdSSLIOHandlerSocket.Create(Self); 
    HttpClient := TIdHTTP.Create(Self); 
    Params := TStringStream.create(''); 
    try 
    with SSLHandler do 
     SSLOptions.Method := sslvSSLv3 
    with HttpClient do 
    begin 
     IOHandler := SSLHandler; 
     AllowCookies := True; 
     HandleRedirects := True; 
     HTTPOptions := [hoForceEncodeParams]; 
     Request.ContentType := 'application/x-www-form-urlencoded'; 
    end; 

    PageMemo.Text := HttpClient.Post('https://email.us-east-1.amazonaws.com?Action=VerifyEmailAddress&AWSAccessKeyId=012Some123Key46&[email protected]%2Ecom', Params); 

    finally 
    SSLHandler.Free; 
    HttpClient.Free; 
    Params.Free; 
    end; 
end; 

Risultato

  • Sotto Indy 10.5.7 ottengo l'errore: HTTP/1.1 404 Not Found

  • Sotto Indy 9.0.14 viene visualizzato l'errore: Errore socket # 11004

Trials debug

  • Questa stessa demo può ottenere con successo il codice HTML da una pagina web HTTPS.

  • Se si incolla l'URL sopra in un browser, viene visualizzato il risultato XML previsto.

Apprezzerei qualsiasi consiglio sulla causa.

+2

credo che hai bisogno i DLL SSL di nella stessa cartella dell'applicazione o nella cartella system32 di Windows ... fammi sapere se vuoi che carichi quelli che ho da qualche parte, la mia versione è libeay32.dll 1.0.0.4 e ssleay32.dll 1.0.0.4 – ComputerSaysNo

+1

Non lo fai 'POST' any' Params', sei sicuro di voler comunicare con il webservice in questo modo? –

+1

@PrematureOptimizzazione tutto dopo? è param name = value, in questo caso Action = VerifyEmailAddress & AWSAccessKeyId = 012Some123Key46 & EmailAddress = test @ test% 2Ecom – ComputerSaysNo

risposta

3

Questo post è solo una supposizione selvaggia incompleta.

Forse Remy potrebbe aiutarti a correggerlo. Con il seguente codice sto ricevendo HTTP/1.1 400 Bad Request ma non mi sto chiedendo perché lo API reference parla di Common Query Parameters dove è richiesta almeno la firma digitale che creerai per la richiesta cosa non so come fare .

Non riesco a verificarlo perché non ho un account lì. Ma penso che il

procedure TForm1.Button1Click(Sender: TObject); 
var 
    HTTPClient: TIdHTTP; 
    Parameters: TStrings; 
    SSLHandler: TIdSSLIOHandlerSocketOpenSSL; 

begin 
    SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    HTTPClient := TIdHTTP.Create(nil); 
    Parameters := TStringList.Create; 

    try 
    SSLHandler.SSLOptions.Method := sslvSSLv3; 
    SSLHandler.SSLOptions.Mode := sslmUnassigned; 

    HTTPClient.IOHandler := SSLHandler; 
    HTTPClient.HTTPOptions := [hoForceEncodeParams]; 
    HTTPClient.Request.ContentType := 'application/x-www-form-urlencoded'; 

    Parameters.Add('Action=VerifyEmailAddress'); 
    Parameters.Add('[email protected]'); 
    Parameters.Add('AWSAccessKeyId=012Some123Key46'); 
    Parameters.Add('SignatureVersion=2'); 
    Parameters.Add('Expires='); // ??? 
    Parameters.Add('Signature='); // ??? 

    PageMemo.Text := HTTPClient.Post('https://email.us-east-1.amazonaws.com', Parameters); 

    finally 
    SSLHandler.Free; 
    HTTPClient.Free; 
    Parameters.Free; 
    end; 
end; 
+0

Grazie, ci provo, anche se non riesco a capire perché dovrei ottenere un risultato diverso tra Indy e incollare lo stesso URL in il browser. Sicuramente IOW se il problema è dovuto ai parametri dovrei ricevere il loro risultato di errore XML?!? – Xaz

+0

@Xaz, ad esempio Firefox visualizza il contenuto anche se riceve l'errore 'HTTP 400 Bad Request'. Per esempio. Internet Explorer informa che la richiesta non è stata eseguita correttamente e non visualizza la risposta del contenuto XML, Indy funziona allo stesso modo, crea il messaggio di errore e elimina il contenuto. La richiesta dal tuo esempio ha parametri errati; vale a dire [IncompleteSignature] (http://docs.amazonwebservices.com/ses/latest/APIReference/index.html?CommonErrors.html) che cosa ti dà come descritto nella tabella HTTP Status Code = 400 (richiesta errata). – TLama

+0

Grazie per aver colmato le lacune nella mia comprensione. Sto facendo buoni progressi adesso. – Xaz

Problemi correlati