2011-10-14 19 views
9

Tengo problemas para publicar en el servicio SES de Amazon usando TIdHTTP de Indy.Publicar problemas con Indy TIdHTTP

Aquí se muestra un ejemplo del código que estoy utilizando:

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; 

Resultado

  • Bajo Indy 10.5.7 me sale el error: HTTP/1.1 404 Not Found

  • Bajo Indy 9.0.14 Aparece el error: Error de socket # 11004

Ensayos de depuración

  • Este mismo grupo demográfico pueden conseguir con éxito el código HTML de una página web HTTPS.

  • Si pego la URL anterior en un navegador, muestra el resultado XML esperado.

Agradecería cualquier consejo sobre la causa.

+2

que cree que necesita los DLL SSL en la misma carpeta que la aplicación o en la carpeta de Windows system32 ... avíseme si desea que cargue las que tengo en algún lado, mi versión es libeay32.dll 1.0.0.4 y ssleay32.dll 1.0.0.4 – ComputerSaysNo

+1

No lo hace 'POST' cualquier' Params', ¿está seguro de que desea comunicarse con el servicio web de esta manera? –

+1

@PrematureOptimization todo después? es param name = value, en este caso Action = VerifyEmailAddress & AWSAccessKeyId = 012Some123Key46 & EmailAddress = test @ test% 2Ecom – ComputerSaysNo

Respuesta

3

Esta publicación es solo una conjetura incompleta..

Tal vez Remy podría ayudarlo a corregirlo. Con el siguiente código recibo HTTP/1.1 400 Bad Request pero no me pregunto porque el API reference habla de Common Query Parameters donde al menos se requiere la firma digital que creará para la solicitud lo que no sé cómo hacer .

No puedo probar esto porque no tengo ninguna cuenta allí. Pero creo que la

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

Gracias intentaré eso, aunque no veo por qué debería obtener un resultado diferente entre Indy y pegar la misma URL en el navegador. IOW seguramente si el problema se debe a los parámetros que debería recibir su resultado de falla XML?!? – Xaz

+0

@ Xaz, por ejemplo, Firefox muestra el contenido incluso si recibe el error 'HTTP 400 Bad Request'. P.ej. Internet Explorer le dice que se produjo una mala solicitud y no muestra la respuesta del contenido XML, Indy funciona igual, crea el mensaje de error y descarta el contenido. La solicitud de su ejemplo tiene parámetros incorrectos; es decir [IncompleteSignature] (http://docs.amazonwebservices.com/ses/latest/APIReference/index.html?CommonErrors.html) lo que le da como se describe en la tabla HTTP Status Code = 400 (solicitud incorrecta). – TLama

+0

Gracias por llenar los vacíos en mi entendimiento. Estoy haciendo un buen progreso ahora. – Xaz