Einzelnen Beitrag anzeigen

Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#3

Re: SOAP-Request zusätzliche Felder hinzufügen

  Alt 22. Apr 2010, 12:46
Also, ich habe das ganze jetzt mal versucht umzusetzen. Der Request sieht soweit in Ordnung aus, trotzdem kommt ein "401 Unauthorized". Evtl. sieht jemand meinen Fehler oder kann mir helfen ihn zu lösen. Ich fürchte, dass die Signatur falsch berechnet wird und es ein Unicode/Ansi-Problem ist, komme aber seit Stunden nicht weiter
Delphi-Quellcode:
  TAmazonAuth = class(TSoapHeader)
  private
    FAWSAccessKeyId: string;
    FTimestamp: string;
    FSignature: string;
  published
    property AWSAccessKeyId: string (* index (IS_REF) *) Read FAWSAccessKeyId Write FAWSAccessKeyId;
    property Timestamp: string Read FTimestamp Write FTimestamp;
    property Signature: string Read FSignature Write FSignature;
  end;

implementation

function emt_now: TDateTime;
var
  st: TSystemTime;
begin
  GetSystemTime(st);
  Result := SystemTimeToDateTime(st);
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  Headers: ISOAPHeaders;
  Hdr: TAmazonAuth;
  ctx: THMAC_Context;
  mac: THashDigest;
  phash: PHashDesc;
  AmazonString, AmazonTimestamp, AmazonSignature: ansistring;
  AWSPort: AWSECommerceServicePortType;
  body: ItemSearch;
  arr_request: Array_Of_ItemSearchRequest;
  aRequest: ItemSearchRequest;
  aResponse: ItemSearchResponse;
  i: integer;
  j: integer;
begin
  AWSPort := GetAWSECommerceServicePortType(False, '', RIO);

  RemClassRegistry.RegisterXSClass(TAmazonAuth, 'http://security.amazonaws.com/doc/2007-01-01/', 'TAmazonAuth');
  InvRegistry.RegisterHeaderClass(TypeInfo(AWSECommerceServicePortType), TAmazonAuth, 'Header', 'http://security.amazonaws.com/doc/2007-01-01/'); {and the header}

  Headers := RIO as ISOAPHeaders;
  Hdr := TAmazonAuth.Create;

  //Authentication
  AmazonTimestamp := FormatDateTime('yyyy"-"mm"-"dd"T"hh":"nn":"ss"Z"', emt_now);

  AmazonString := 'ItemSearch' + AmazonTimestamp;

  // Generate Request and Signature - Build Signature
  phash := FindHash_by_Name('SHA256');
  hmac_inits(ctx, phash, sAWSID);
  hmac_update(ctx, @AmazonString[1], Length(AmazonString));
  hmac_final(ctx, mac);
  AmazonSignature := Base64Str(@mac[1], sizeof(TSHA256Digest));

  Hdr.FSerializationOptions := [xoHolderClass, xoAttributeOnLastMember, xoSimpleTypeWrapper];
  Hdr.FAWSAccessKeyId := AWSID;
  Hdr.FTimestamp := AmazonTimestamp;
  Hdr.FSignature := AmazonSignature;
  Headers.Send(Hdr);

  body := ItemSearch.Create;
  body.AWSAccessKeyId := AWSID;

  aRequest := ItemSearchrequest.Create;
  aRequest.SearchIndex := 'Video';
  aRequest.Title := 'Matrix';

  SetLength(arr_request, 1);
  arr_request[0] := aRequest;
  body.Request := arr_request;

  aResponse := AWSPort.ItemSearch(body);
  for i := 0 to Length(aResponse.Items) - 1 do
    for j := 0 to Length(aResponse.Items[i].Item) - 1 do
    begin
      LiveLog.Lines.Add(aResponse.Items[i].Item[j].ItemAttributes.Title);
    end;
end;
LiveLog ist ein einfaches Memo in dem die Ergebnisse stehen sollen. Die Konstanten für die Schlüssel muss man natürlich noch ändern:
Delphi-Quellcode:
const
  AWSID = 'Die AWS ID';
  sAWSID = 'Die geheime AWS ID';
  Mit Zitat antworten Zitat