Od jakiegoś czasu piszę dużo zapytań do usług SOAP. Z racji że sam siedziałem nad tematem autoryzacji dosyć długo, postanowiłem opisać kilka przydatnych rzeczy. Pierwsza jaka przychodzi na myśl to dodanie metody autoryzacji UsernameToken Profile w wysyłanej kopercie (Envelope). WSDL importer w Delphi wykona za nas większość pracy jeżeli chodzi o mapowanie struktury do klasy pomocniczej. Następnie zostaje tylko zmodyfikowanie struktury koperty tuż przed jej wysłaniem i dodanie sekcji Security przed body w ciele koperty. Kod mówi sam za siebie:
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
Soap.InvokeRegistry, System.Net.URLClient, Soap.Rio, Soap.SOAPHTTPClient,
SynEdit, SynEditHighlighter, SynHighlighterXML, Xml.xmldom, Xml.XMLIntf,
Xml.XMLDoc,
msxml;
type
TForm2 = class(TForm)
HTTPRIO1: THTTPRIO;
SOAPRequestXML: TXMLDocument;
procedure HTTPRIO1BeforeExecute(const MethodName: string;
SOAPRequest: TStream);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.HTTPRIO1BeforeExecute(const MethodName: string;
SOAPRequest: TStream);
var
SOAPMessage: IXmlNode;
SOAPBody: IXmlNode;
SOAPSecurity: IXMLNode;
UsernameToken: IXMLNode;
begin
SOAPRequest.Position := 0;
SOAPRequestXML.LoadFromStream(SOAPRequest);
SOAPMessage := SOAPRequestXML.DocumentElement;
//Dodajemy przestrzeń nazw wss
SOAPMessage.DeclareNamespace('wss', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd');
SOAPBody := SOAPMessage.ChildNodes[0];
//Dodawanie nagłówka Security jako piewszy node koperty
SOAPSecurity := SOAPMessage.AddChild('wss:Security',0);
//Dodajemy sekcje Security wraz z tokenem i danymi do uwierzytelnienia
UsernameToken := SOAPSecurity.AddChild('wss:UsernameToken');
UsernameToken.AddChild('wss:Username').NodeValue := 'user';
UsernameToken.AddChild('wss:Password').NodeValue := 'password';
SOAPRequest.Position:= 0;
SOAPRequestXML.SaveToStream(SOAPRequest);
end;
end.
W taki oto sposób możemy zmodyfikować wysyłaną wiadomość do usługi SOAP. Referencje do komponentu HTTPRIO1 przekazujemy podczas wywoływania funkcji dostarczanych przez usługę. Przed samym wysłaniem zapytania zdarzenie BeforeExecute będzie dodawało odpowiednie dane autoryzacyjne do koperty.
Od jakiegoś czasu piszę dużo zapytań do usług SOAP. Z racji że sam siedziałem nad te...
gg
gg
EndOfTheMonth
EndOfTheMonth
EndOfTheMonth
EndOfTheDay
EndOfTheDay
EndOfTheDay
EndOfTheDay
Ooo, Pascal i SOAP. Brakuje tylko tabliczek glinianych XD