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/
в отношении
Хосе