Post проблемы с Indy TIdHTTP

У меня возникли проблемы с публикацией в Amazon SES обслуживание используя TIdHTTP Indy.

вот пример кода, который я использую:

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 не найден

  • в Indy 9.0.14 я получаю ошибку: Ошибка сокета # 11004

отладка Испытания!--9-->

  • эта же демонстрация может успешно получить HTML с веб-страницы HTTPS.

  • если я вставляю URL-адрес выше в браузер, он отображает ожидаемый результат XML.

буду признателен за любые советы по делу.

2 ответов


этот пост просто неполная дикая догадка.

может, Реми может помочь вам исправить это. Со следующим кодом я получаю 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;

в принципе, вам нужно использовать правильную библиотеку, т. е.:

для Indy 10.5.7 используйте openssl-1.0.1 e-i386-win32 или openssl-1.0.1 e-x64_86-win64 из http://indy.fulgan.com/SSL/ Вы можете загрузить демо ssl из:http://indy.fulgan.com/ZIP/

в отношении

Хосе