9

我在使用 Indy 的 TIdHTTP发布到 Amazon 的SES服务时遇到问题。

这是我正在使用的代码示例:

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&EmailAddress=test@test%2Ecom', Params);

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

结果

  • 在 Indy 10.5.7 下我得到错误:HTTP/1.1 404 Not Found

  • 在 Indy 9.0.14 下我得到错误: Socket Error # 11004

调试试验

  • 同样的演示可以成功地从 HTTPS 网页获取 HTML。

  • 如果我将上面的 URL 粘贴到浏览器中,它会显示预期的 XML 结果。

我将不胜感激有关原因的任何建议。

4

2 回答 2

3

这篇文章只是一个不完整的猜测

也许雷米可以帮助你纠正它。使用以下代码,我收到 HTTP/1.1 400 错误请求,但我并不怀疑,因为API reference讨论Common Query Parameters至少需要您为请求创建的数字签名在哪里,而我不知道该怎么做。

我根本无法测试这个,因为我在那里没有帐户。但我认为

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('EmailAddress=test@test.com');
    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;
于 2011-10-14T14:45:42.593 回答
0

基本上,您需要使用正确的库,即:

对于 Indy 10.5.7,请使用 http://indy.fulgan.com/SSL/ 的 openssl-1.0.1e-i386-win32 或 openssl-1.0.1e-x64_86-win64 可能需要从以下网址下载 ssl 演示:http: //indy.fulgan.com/ZIP/

问候

何塞

于 2013-11-12T15:25:06.027 回答