2011-10-14 26 views
9

Tôi gặp sự cố khi đăng lên Dịch vụ SES của Amazon bằng TIdHTTP của Indy.Đăng sự cố với Indy TIdHTTP

Dưới đây là một ví dụ về mã tôi đang sử dụng:

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; 

quả

  • Dưới Indy 10.5.7 Tôi nhận được lỗi: HTTP/1.1 404 Not Found

  • Theo Indy 9.0.14 Tôi gặp lỗi: Lỗi Socket # 11004

Debugging Trials

  • cùng bản demo này có thể GET thành công HTML từ một trang web HTTPS.

  • Nếu tôi dán URL ở trên vào trình duyệt, nó sẽ hiển thị kết quả XML mong đợi.

Tôi sẽ đánh giá cao mọi lời khuyên về nguyên nhân.

+2

tôi tin rằng bạn cần của dll SSL trong cùng thư mục với ứng dụng hoặc trong thư mục system32 của cửa sổ ... hãy cho tôi biết nếu bạn muốn tôi tải lên những cái tôi có ở đâu đó, phiên bản của tôi là libeay32.dll 1.0.0.4 và ssleay32.dll 1.0.0.4 – ComputerSaysNo

+1

Bạn không 'POST' bất kỳ' Params' nào, bạn có chắc chắn muốn liên lạc với webservice theo cách này không? –

+1

@PrematureOptimization mọi thứ sau? là giá trị tên = param, trong trường hợp này Action = VerifyEmailAddress & AWSAccessKeyId = 012Some123Key46 & EmailAddress = test @ test% 2Ecom – ComputerSaysNo

Trả lời

3

Bài đăng này là chỉ là một phỏng đoán hoang dã chưa hoàn chỉnh.

Có thể Remy có thể giúp bạn sửa nó. Với mã sau tôi nhận được yêu cầu HTTP/1.1 400 Bad nhưng tôi không tự hỏi vì các cuộc hội thoại API reference về số Common Query Parameters ít nhất là yêu cầu chữ ký số bạn sẽ tạo cho yêu cầu những gì tôi không biết cách thực hiện .

Tôi không thể kiểm tra điều này vì tôi không có tài khoản ở đó. Nhưng tôi nghĩ rằng

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

Cảm ơn tôi sẽ thử điều đó, mặc dù tôi không thể thấy tại sao tôi nên nhận kết quả khác nhau giữa Indy và dán cùng một URL vào Trình duyệt. IOW chắc chắn nếu vấn đề là do các thông số tôi sẽ nhận được kết quả thất bại XML của họ?!?Ví dụ: – Xaz

+0

@Xaz, Firefox hiển thị nội dung ngay cả khi nhận được lỗi "HTTP 400 Bad Request'. Ví dụ. Internet Explorer cho bạn biết rằng yêu cầu xấu đã xảy ra và không hiển thị phản hồi nội dung XML, Indy hoạt động tương tự, tạo thông báo lỗi và vứt bỏ nội dung. Yêu cầu từ ví dụ của bạn có thông số sai; cụ thể là [IncompleteSignature] (http://docs.amazonwebservices.com/ses/latest/APIReference/index.html?CommonErrors.html) những gì cung cấp cho bạn như được mô tả trong bảng HTTP Status Code = 400 (yêu cầu xấu). – TLama

+0

Cảm ơn bạn đã điền vào những khoảng trống trong sự hiểu biết của tôi. Tôi đang tiến bộ tốt ngay bây giờ. – Xaz

0

Về cơ bản, bạn cần phải sử dụng thư viện đúng, ví dụ:

Đối với Indy 10.5.7 sử dụng openssl-1.0.1e-i386-win32 hoặc openssl-1.0.1e-x64_86 -win64 từ http://indy.fulgan.com/SSL/ bạn có thể muốn tải về một bản demo ssl từ: http://indy.fulgan.com/ZIP/

Trân

Jose