Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Правильный запрос для метода ListDomains в Amazon SimpleDB: Валидация с использованием WSDL и элементов авторизации

Delphi , Синтаксис , Ошибки и Исключения

Вопрос, поднятый в данной теме, касается правильности примера запроса для метода ListDomains в Amazon SimpleDB, который включает в себя элементы Signature, Timestamp, AWSAccessKeyId и Version. Эти элементы не отображаются в определении ListDomains в WSDL. Поддержка AWS утверждает, что такое разделение является частью дизайна и представляет более чистый подход, который лучше соответствует долгосрочной модели "SOAP с WS-Security".

Описание проблемы

Пример запроса для метода ListDomains в документации SimpleDB содержит элементы Signature, Timestamp, AWSAccessKeyId и Version, которые не указаны в определении ListDomains в WSDL. Это вызывает путаницу при попытке импортирования WSDL в Delphi, так как не генерируется код для элементов авторизации.

Контекст для написания статьи

  1. Оригинальный запрос и его структура.
  2. Определение ListDomains в WSDL.
  3. Комментарии AWS о дизайне WSDL.
  4. Возможность ручного добавления элементов авторизации в Delphi или WSDL.

Подтвержденный ответ

На основе предоставленной информации, элементы авторизации действительно не являются частью WSDL, что может показаться нелогичным. Документация Amazon указывает на необходимость предоставления этих данных в SOAP заголовке, однако в примере они размещены в элементе SOAP-ENV:Body.

Альтернативный ответ

Существует возможность ручной правки WSDL, чтобы добавить элементы авторизации. Однако это может потребовать повторного применения изменений при обновлении WSDL. В сообществе разработчиков AWS уже были подобные проблемы, и некоторые пользователи предлагали "взломанные" версии WSDL. Возможно, существует более элегантное решение, которое не потребует постоянного обновления кода при изменении WSDL.

Пример решения на Object Pascal (Delphi)

Для решения проблемы с авторизацией в запросах к Amazon SimpleDB, можно использовать следующий подход в Delphi:

uses
  System.SysUtils,
  System.Net.HttpClient,
  System.Net.Http;

type
  TMyAWSClient = class
  private
    FClient: TIdHTTP;
  public
    constructor Create;
    destructor Destroy; override;
    procedure SendRequest(const AURL: string; const ARequest: TStringList; var AResponse: TStringList);
  end;

constructor TMyAWSClient.Create;
begin
  FClient := TIdHTTP.Create(nil);
  FClient.HandleRedirects := False;
  FClient.Request.Expect := 100Continue;
  FClient.Request.ContentType := 'text/xml';
  FClient.Request.Connection := 'KeepAlive';
end;

destructor TMyAWSClient.Destroy;
begin
  FClient.Free;
  inherited;
end;

procedure TMyAWSClient.SendRequest(const AURL: string; const ARequest: TStringList; var AResponse: TStringList);
var
  RequestBody: TStringList;
begin
  RequestBody := TStringList.Create;
  try
    RequestBody.Text := '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">'#10;
    RequestBody.Text := RequestBody.Text + '<SOAP-ENV:Header/>'#10;
    RequestBody.Text := RequestBody.Text + '<SOAP-ENV:Body>'#10;
    RequestBody.Text := RequestBody.Text + '<ListDomainsRequest xmlns="http://sdb.amazonaws.com/doc/2007-11-07">'#10;
    RequestBody.Text := RequestBody.Text + '<Signature>SZf1CHmQnrZbsrC13hCZS061ywsEXAMPLE</Signature>'#10;
    RequestBody.Text := RequestBody.Text + '<Timestamp>2009-02-16T17:39:51.000Z</Timestamp>'#10;
    RequestBody.Text := RequestBody.Text + '<AWSAccessKeyId>1D9FVRAYCP1VJS767E02EXAMPLE</AWSAccessKeyId>'#10;
    RequestBody.Text := RequestBody.Text + '<Version>2007-11-07</Version>'#10;
    RequestBody.Text := RequestBody.Text + '<Action>ListDomains</Action>'#10;
    RequestBody.Text := RequestBody.Text + '<MaxNumberOfDomains>100</MaxNumberOfDomains>'#10; // Пример параметра
    RequestBody.Text := RequestBody.Text + '</ListDomainsRequest>'#10;
    RequestBody.Text := RequestBody.Text + '</SOAP-ENV:Body>'#10;
    RequestBody.Text := RequestBody.Text + '</SOAP-ENV:Envelope>'#10;

    // Добавление заголовка авторизации
    RequestBody.Text := '<Signature xmlns="http://sdb.amazonaws.com/doc/2007-11-07/SignatureType" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">' +
      '<SignatureValue>ИМЯ_СТРУКТУРИРОВАННОГО_ЗНАЧЕНИЯ_ПОДПИСИ</SignatureValue>' +
      '<SignedHeaders>POST;host;x-amz-content-sha256</SignedHeaders>' +
      '<SignatureMethod>HMAC-SHA256</SignatureMethod>' +
      '</Signature>' +
      '<Timestamp xmlns="http://sdb.amazonaws.com/doc/2007-11-07/TimestampType">20230101T000000Z</Timestamp>' +
      '<AWSAccessKeyId xmlns="http://sdb.amazonaws.com/doc/2007-11-07/">ВАШ_АККАУНТ_ИД</AWSAccessKeyId>' +
      'в SOAP заголовке, как указано в документации Amazon';

    FClient.Request.Content := TStreamAdapter.Create(TMemoryStream.Create((RequestBody.Text + #13#10).ToAnsiString, TEncoding.ASCII));
    FClient.Request.CustomHeaders.Add('Host', AURL);
    FClient.Request.CustomHeaders.Add('Content-Type', 'text/xml');
    FClient.Request.CustomHeaders.Add('Authorization', 'AUTHORIZATION_VALUE'); // Добавить валидное значение авторизации
    FClient.Request.CustomHeaders.Add('X-Amz-Date', 'A_DATE'); // Пример даты
    FClient.Request.CustomHeaders.Add('X-Amz-Content-SHA256', 'A_HASH'); // Пример хеша

    AResponse := TStringList.Create;
    try
      AResponse.Text := FClient.Do('POST', AURL, RequestBody.Text);
    finally
      AResponse.StrictDelimiter := True;
    end;
  finally
    RequestBody.Free;
  end;
end;

В данном примере кода создается клиент для отправки запросов к Amazon SimpleDB, который включает необходимые элементы авторизации в теле запроса, а также добавляет соответствующие заголовки для авторизации.

Заключение

Правильный запрос для метода ListDomains включает в себя не только элементы, определенные в WSDL, но и элементы авторизации, которые должны быть добавлены вручную. Это может потребовать от разработчика знания о формировании SOAP-запросов и работе с WSDL вручную, а также понимания процесса авторизации в Amazon AWS.

Создано по материалам из источника по ссылке.

Вопрос связан с технической детализацией использования метода `ListDomains` в Amazon SimpleDB, включая валидацию с использованием WSDL и элементы авторизации, что может вызвать затруднения при попытке интеграции с некоторыми разработческими инс


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ошибки и Исключения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 12:55:08/0.0037870407104492/0