2011-10-14 15 views
9

Mam problemy z publikowaniem w serwisie Amazon firmy SES przy użyciu usługi TIdHTTP firmy Indy.Publikuj problemy z Indy TIdHTTP

Oto przykład kodu używam:

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; 

Wynik

  • Pod Indy 10.5.7 pojawia się błąd: HTTP/1.1 404 Not Found

  • Pod indeksem 9.0.14 pojawia się błąd: Błąd gniazda # 11004

debugowania Trials

  • to samo demo może z powodzeniem GET HTML od strony HTTPS.

  • Jeśli wkleję powyższy adres URL do przeglądarki, wyświetli oczekiwany wynik XML.

Byłbym wdzięczny za wszelkie porady dotyczące przyczyny.

+2

wierzę trzeba dll SSL-tych w tym samym folderze co aplikacja lub w folderze system32 systemu Windows ... daj mi znać, jeśli chcesz, żebym przesłał te, które mam gdzieś, moja wersja to libeay32.dll 1.0.0.4 i ssleay32.dll 1.0.0.4 – ComputerSaysNo

+1

Nie musisz 'POST' any' Params', jesteś pewien, że chcesz komunikować się z webservice w ten sposób? –

+1

@PrematureOptimization wszystko po? jest parametrem nazwa = wartość, w tym przypadku Action = VerifyEmailAddress i AWSAccessKeyId = 012Some123Key46 & EmailAddress = test @ test% 2Ecom – ComputerSaysNo

Odpowiedz

3

Ten wpis jest po prostu niekompletne, dzikie domysły.

Może Remy może pomóc ci to poprawić. Za pomocą poniższego kodu otrzymuję złe żądanie HTTP/1.1 400, ale nie zastanawiam się, ponieważ API reference mówi o Common Query Parameters gdzie jest wymagane co najmniej podpis cyfrowy, który utworzysz dla żądania, czego nie wiem, jak to zrobić .

Nie mogę tego przetestować, ponieważ nie mam tam konta. Ale myślę, że

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

Dzięki, że spróbuję, chociaż nie rozumiem, dlaczego powinienem uzyskać inny wynik między Indy i wklejenie tego samego adresu URL do przeglądarka. IOW na pewno, jeśli problem wynika z parametrów i powinien otrzymać wynik błędu XML?!? – Xaz

+0

@ Xaz, na przykład Firefox wyświetla zawartość, nawet jeśli otrzyma komunikat o błędzie "HTTP 400 Bad Request". Na przykład. Internet Explorer powie Ci, że wystąpił zły wniosek i nie wyświetla odpowiedzi na treść XML, Indy działa tak samo, tworzy komunikat o błędzie i wyrzuca zawartość. Żądanie z twojego przykładu ma nieprawidłowe parametry; mianowicie [IncompleteSignature] (http://docs.amazonwebservices.com/ses/latest/APIReference/index.html?CommonErrors.html), co daje, jak opisano w tabeli HTTP Status Code = 400 (złe żądanie). – TLama

+0

Dziękuję za wypełnienie luk w moim rozumieniu. Teraz robię duże postępy. – Xaz

Powiązane problemy