Entwickler-Ecke
Internet / Netzwerk - WebService XML basiert, mittels HTTPS
DerNetteNachbar - Di 23.12.08 13:57
Titel: WebService XML basiert, mittels HTTPS
Hallo ihr Lieben,
Ich möchte ein Request an einen Server senden und zwar mittels POST bzw. GET Methode. Die GET Methode klappt (ohne Parameter)auch ganz hervoragend, denn ich bekomme eine XML Datei zurück die ich auswerten könnte. Nur um die richtige XML Datei zu bekommen muss ich die Parameter setzen und genau das bereitet mir etwas Probleme. Die Schnittstellenbeschreibung hab ich nur komme ich da nicht wirklich weiter.
Wenn einer von euch mir helfen könnte würde ich mich sehr freuen.
Die Schnittstellenbeschreibung:
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172:
| <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.vdlinde.de/lieferung/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Lieferung" targetNamespace="http://ws.vdlinde.de/lieferung/"> <wsdl:types> <xsd:schema targetNamespace="http://ws.vdlinde.de/lieferung/"> <xsd:complexType name="RequestPosition"> <xsd:sequence> <xsd:element name="PZN" minOccurs="1" maxOccurs="1"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:minLength value="2"></xsd:minLength> <xsd:maxLength value="13"></xsd:maxLength> <xsd:pattern value="[0-9]{2,13}"></xsd:pattern> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="Menge" minOccurs="1" maxOccurs="1">
<xsd:simpleType> <xsd:restriction base="xsd:int">
<xsd:minInclusive value="1"></xsd:minInclusive> <xsd:maxInclusive value="9999"></xsd:maxInclusive> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="Hinweis" minOccurs="0" maxOccurs="1"> <xsd:simpleType> <xsd:restriction base="xsd:string">
<xsd:length value="2"></xsd:length> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="Positionsreferenz" minOccurs="0" maxOccurs="1"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:minLength value="1"></xsd:minLength> <xsd:maxLength value="7"></xsd:maxLength> <xsd:pattern value="[0-9]{1,7}"></xsd:pattern> </xsd:restriction> </xsd:simpleType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="RequestPositionArray"> <xsd:sequence> <xsd:element minOccurs="1" maxOccurs="50" name="RequestPositionElement" type="tns:RequestPosition" /> </xsd:sequence> </xsd:complexType> <xsd:element name="LieferungRequest"> <xsd:complexType> <xsd:sequence> <xsd:element name="Typ" minOccurs="1" maxOccurs="1"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="AUSKUNFT"/> <xsd:enumeration value="AUFTRAG"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="AuftragsNr" minOccurs="0" maxOccurs="1"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:minLength value="1"></xsd:minLength> <xsd:maxLength value="7"></xsd:maxLength> <xsd:pattern value="[0-9]{1,7}"></xsd:pattern> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="AuftragsArt" minOccurs="0" maxOccurs="1"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:minLength value="2"></xsd:minLength> <xsd:maxLength value="2"></xsd:maxLength> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="Liefertermin" minOccurs="0" maxOccurs="1"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="ZH"/> <xsd:enumeration value="ZM"/> <xsd:enumeration value="ZD"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="Positionen" type="tns:RequestPositionArray" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="ResponsePosition"> <xsd:sequence> <xsd:element name="PZN" type="xsd:string" minOccurs="1" maxOccurs="1"/> <xsd:element name="MengeGeliefert" type="xsd:int" minOccurs="1" maxOccurs="1"/> <xsd:element name="MengeVerbundlieferung" type="xsd:int" minOccurs="0" maxOccurs="1"/> <xsd:element name="MengeDisponierbar" type="xsd:int" minOccurs="0" maxOccurs="1"/> <xsd:element name="Defektgrund" type="xsd:string" minOccurs="0" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="ResponsePositionArray"> <xsd:sequence> <xsd:element minOccurs="1" maxOccurs="50" name="ResponsePositionElement" type="tns:ResponsePosition" /> </xsd:sequence> </xsd:complexType> <xsd:element name="LieferungResponse"> <xsd:complexType> <xsd:sequence> <xsd:element name="Lieferzeit" type="xsd:string" minOccurs="1" maxOccurs="1"/> <xsd:element name="LieferzeitVerbundlieferung" type="xsd:string" minOccurs="0" maxOccurs="1"/> <xsd:element name="FehlercodeBearbeitung" type="xsd:string" minOccurs="0" maxOccurs="1"/> <xsd:element name="Fehlertext" type="xsd:string" minOccurs="0" maxOccurs="1"/> <xsd:element name="Positionen" type="tns:ResponsePositionArray" minOccurs="0" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ws.vdlinde.de/lieferung/"> <xsd:element name="NewOutput" type="xsd:string"></xsd:element> </xsd:schema> </wsdl:types> <wsdl:message name="LieferungRequest"> <wsdl:part element="tns:LieferungRequest" name="parameters" /> </wsdl:message> <wsdl:message name="LieferungResponse"> <wsdl:part element="tns:LieferungResponse" name="parameters" /> </wsdl:message> <wsdl:portType name="Lieferung"> <wsdl:operation name="Lieferung"> <wsdl:input message="tns:LieferungRequest" /> <wsdl:output message="tns:LieferungResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="LieferungSOAP" type="tns:Lieferung"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="Lieferung"> <soap:operation soapAction="http://ws.vdlinde.de/lieferung/Lieferung" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="Lieferung"> <wsdl:port binding="tns:LieferungSOAP" name="LieferungSOAP"> <soap:address location="http://localhost:8080/WebServices/services/Lieferung" /> </wsdl:port> </wsdl:service> </wsdl:definitions> |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.Button1Click(Sender: TObject); var PostDataStream : TStringStream; ParamData : TStringStream;
begin PostDataStream := TStringStream.Create(''); ParamData := TStringStream.Create(''); ParamData.WriteString('pzn=PZN-7'); ParamData.WriteString('Menge=10'); try IdHTTP1.Post('https://ws.vdlinde.de/ws/services/Lieferung?wsdl', ParamData, PostDataStream); |
Danke schon mal im Vorraus.
liebe Grüsse
Nachbar
BenBE - Di 23.12.08 14:13
Ein TStringStream schreibt exakt, was du an Strings reingibst, nicht mehr und nicht weniger. Wenn Du also WriteString zwei mal aufrufst, dann kommt das einem StrConcat gleich.
Bei den GET-Parametern solltest du daher mal schauen, inwiefern das Voranstellen von & hilft, ansonsten auch mal nach jedem Parameter einen Zeilenumbruch probieren. Weiß grad nicht, wie die Indy's das bei den Parameter-Strömen haben wollen ...
DerNetteNachbar - Di 23.12.08 14:18
Das grösste Problem ist die Parameter aus der Schnittstellenbeschreibung in Delphi richtig zu verwenden, deshalb auch meine Frage wenn ich einen Parameter z.B. PZN anspreche und setze ob es dann auch wirklich so ist. Denn über XML mit dem kommunizieren ist mir nicht so verständlich.
liebe Grüsse
DerNetteNachbar - Mi 24.12.08 12:55
PUSH
matze - Mi 24.12.08 13:12
Das was du machen willst, ist ja mit einem SOAP Service zu kommunizieren.
Schau dir dazu doch einfach mal Tutorials zu SOAP an. Zum Beispiel auf
http://www.dsdt.info Das ist meiner Meinung nach besser, als wenn du das selber mit den Indys zusammenstöpselst.
DerNetteNachbar - Mi 24.12.08 16:58
Könnt ihr mir bestimmte Tuts ans Herz legen?
liebe Grüsse
nachbar
DerNetteNachbar - Do 25.12.08 21:07
Die kenn ich schon, leider haben die nicht den erhofften Effekt gebracht.
DerNetteNachbar - Sa 27.12.08 16:17
PUSH
DerNetteNachbar - Sa 03.01.09 16:07
Hallo Leute, bin etwas weitergekommen, leider nicht wo weit wie erhofft.
Das heir ist die erzeugte Unit aus der WSDL Datei
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255:
| unit Lieferung1;
interface
uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns,vdlconst;
type
RequestPosition = class; RequestPositionArray = class; ResponsePosition = class; ResponsePositionArray = class;
Liefertermin = (ZH, ZM, ZD);
RequestPosition = class(TRemotable) private FPZN: PZN; FMenge: Menge; FHinweis: Hinweis; FPositionsreferenz: Positionsreferenz; published property PZN: PZN read FPZN write FPZN; property Menge: Menge read FMenge write FMenge; property Hinweis: Hinweis read FHinweis write FHinweis; property Positionsreferenz: Positionsreferenz read FPositionsreferenz write FPositionsreferenz; end;
RequestPositionElement = array of RequestPosition;
RequestPositionArray = class(TRemotable) private FRequestPositionElement: RequestPositionElement; public constructor Create; override; destructor Destroy; override; function GetRequestPositionArray(Index: Integer): RequestPosition; function GetRequestPositionArrayLength: Integer; property RequestPositionArray[Index: Integer]: RequestPosition read GetRequestPositionArray; default; property Len: Integer read GetRequestPositionArrayLength; published property RequestPositionElement: RequestPositionElement read FRequestPositionElement write FRequestPositionElement; end;
ResponsePosition = class(TRemotable) private FPZN: WideString; FMengeGeliefert: Integer; FMengeVerbundlieferung: Integer; FMengeDisponierbar: Integer; FDefektgrund: WideString; published property PZN: WideString read FPZN write FPZN; property MengeGeliefert: Integer read FMengeGeliefert write FMengeGeliefert; property MengeVerbundlieferung: Integer read FMengeVerbundlieferung write FMengeVerbundlieferung; property MengeDisponierbar: Integer read FMengeDisponierbar write FMengeDisponierbar; property Defektgrund: WideString read FDefektgrund write FDefektgrund; end;
ResponsePositionElement = array of ResponsePosition;
ResponsePositionArray = class(TRemotable) private FResponsePositionElement: ResponsePositionElement; public constructor Create; override; destructor Destroy; override; function GetResponsePositionArray(Index: Integer): ResponsePosition; function GetResponsePositionArrayLength: Integer; property ResponsePositionArray[Index: Integer]: ResponsePosition read GetResponsePositionArray; default; property Len: Integer read GetResponsePositionArrayLength; published property ResponsePositionElement: ResponsePositionElement read FResponsePositionElement write FResponsePositionElement; end;
Lieferung = interface(IInvokable) ['{7C862588-7037-A920-972F-D78AD6C9A026}'] procedure Lieferung(const Typ: Typ; const AuftragsNr: AuftragsNr; const AuftragsArt: AuftragsArt; const Liefertermin: Liefertermin; const Positionen: RequestPositionArray; out Lieferzeit: WideString; out LieferzeitVerbundlieferung: WideString; out FehlercodeBearbeitung: WideString; out Fehlertext: WideString; out Positionen1: ResponsePositionArray); stdcall; end;
function GetLieferung(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): Lieferung;
implementation
function GetLieferung(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): Lieferung; const defWSDL = 'C:\Dokumente und Einstellungen\Yewgeny\Desktop\WSDL\VDL Schnittstelle\VDL Test\Lieferung.wsdl'; defURL = 'https://ws.vdlinde.de/ws/services/Lieferung'; defSvc = 'Lieferung'; defPrt = 'LieferungSOAP'; var RIO: THTTPRIO; begin Result := nil; if (Addr = '') then begin if UseWSDL then Addr := defWSDL else Addr := defURL; end; if HTTPRIO = nil then RIO := THTTPRIO.Create(nil) else RIO := HTTPRIO; try Result := (RIO as Lieferung); if UseWSDL then begin RIO.WSDLLocation := Addr; RIO.Service := defSvc; RIO.Port := defPrt; end else RIO.URL := Addr; finally if (Result = nil) and (HTTPRIO = nil) then RIO.Free; end; end;
constructor RequestPositionArray.Create; begin inherited Create; FSerializationOptions := [xoInlineArrays]; end;
destructor RequestPositionArray.Destroy; var I: Integer; begin for I := 0 to Length(FRequestPositionElement)-1 do if Assigned(FRequestPositionElement[I]) then FRequestPositionElement[I].Free; SetLength(FRequestPositionElement, 0); inherited Destroy; end;
function RequestPositionArray.GetRequestPositionArray(Index: Integer): RequestPosition; begin Result := FRequestPositionElement[Index]; end;
function RequestPositionArray.GetRequestPositionArrayLength: Integer; begin if Assigned(FRequestPositionElement) then Result := Length(FRequestPositionElement) else Result := 0; end;
constructor ResponsePositionArray.Create; begin inherited Create; FSerializationOptions := [xoInlineArrays]; end;
destructor ResponsePositionArray.Destroy; var I: Integer; begin for I := 0 to Length(FResponsePositionElement)-1 do if Assigned(FResponsePositionElement[I]) then FResponsePositionElement[I].Free; SetLength(FResponsePositionElement, 0); inherited Destroy; end;
function ResponsePositionArray.GetResponsePositionArray(Index: Integer): ResponsePosition; begin Result := FResponsePositionElement[Index]; end;
function ResponsePositionArray.GetResponsePositionArrayLength: Integer; begin if Assigned(FResponsePositionElement) then Result := Length(FResponsePositionElement) else Result := 0; end;
initialization InvRegistry.RegisterInterface(TypeInfo(Lieferung), 'http://ws.vdlinde.de/lieferung/', ''); InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Lieferung), 'https://ws.vdlinde.de/lieferung/Lieferung'); InvRegistry.RegisterInvokeOptions(TypeInfo(Lieferung), ioDocument); RemClassRegistry.RegisterXSInfo(TypeInfo(Typ), 'http://ws.vdlinde.de/lieferung/', 'Typ'); RemClassRegistry.RegisterXSInfo(TypeInfo(Liefertermin), 'http://ws.vdlinde.de/lieferung/', 'Liefertermin'); RemClassRegistry.RegisterXSClass(RequestPosition, 'http://ws.vdlinde.de/lieferung/', 'RequestPosition'); RemClassRegistry.RegisterXSInfo(TypeInfo(RequestPositionElement), 'http://ws.vdlinde.de/lieferung/', 'RequestPositionElement'); RemClassRegistry.RegisterXSClass(RequestPositionArray, 'http://ws.vdlinde.de/lieferung/', 'RequestPositionArray'); RemClassRegistry.RegisterSerializeOptions(RequestPositionArray, [xoInlineArrays]); RemClassRegistry.RegisterXSClass(ResponsePosition, 'http://ws.vdlinde.de/lieferung/', 'ResponsePosition'); RemClassRegistry.RegisterXSInfo(TypeInfo(ResponsePositionElement), 'http://ws.vdlinde.de/lieferung/', 'ResponsePositionElement'); RemClassRegistry.RegisterXSClass(ResponsePositionArray, 'http://ws.vdlinde.de/lieferung/', 'ResponsePositionArray'); RemClassRegistry.RegisterSerializeOptions(ResponsePositionArray, [xoInlineArrays]); end. |
Und das der Code den ich dafür benutze eine Anfrage an den Server zu senden
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| procedure TForm1.HttpRioHttpWebNodeBeforePost( const HTTPReqResp: THTTPReqResp; Data: Pointer); var TimeOut : integer; begin TimeOut := 2000; if not InternetSetOption(Data, INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@TimeOut), SizeOf(TimeOut)) then ShowMessage(SysErrorMessage(GetLastError));
if not InternetSetOption(Data, INTERNET_OPTION_USERNAME, PChar(rio.HTTPWebNode.UserName), Length(rio.HTTPWebNode.UserName)) then ShowMessage(SysErrorMessage(GetLastError));
if not InternetSetOption(Data, INTERNET_OPTION_PASSWORD, PChar(rio.HTTPWebNode.Password), Length (rio.HTTPWebNode.Password)) then ShowMessage(SysErrorMessage(GetLastError)); end;
procedure TForm1.Button4Click(Sender: TObject); var rpa : RequestPositionArray; rpa1 : ResponsePositionArray; rp : RequestPosition; s,s1,s2,s3,s4,s5: widestring; len : integer; begin if not Assigned(rio) then begin rio := THTTPRIO.Create(self); rio.HTTPWebNode.UserName := 'username'; rio.HTTPWebNode.Password := 'password'; rio.HTTPWebNode.OnBeforePost := self.HttpRioHttpWebNodeBeforePost; end; if not assigned(lf) then begin lf := GetLieferung(True); lf.Lieferung('AUFTRAG',s,s1,ZH,rpa,s2,s3,s4,s4,rpa1);
rpa.Create; rpa.GetRequestPositionArray(10); rp := rpa.GetRequestPositionArray(10); end; end; |
Aber das Problem: Die Funktion lf.Lieferung liefert mir einen Fehler: Dateityp Typ unbekannt. Kann das jemand für mich bitte ausprobieren und gegenfals helfen.
Danke schon mal im Vorraus.
Nachbar
DerNetteNachbar - So 04.01.09 21:59
PUSH
DerNetteNachbar - Mo 05.01.09 12:29
Hat den keine eine leise Ahnung wie ich die TYpen definieren soll? In der WSDL Datei sind die als string definiert, jedoch wird mir derselbe Fehler gemeldet: und zwar der erste in der Funktion übergebene Typ als 'unexpected subelement Typ'. Typ ist in dem Fall die Definition davon.
MfG
Bernhard Geyer - Mo 05.01.09 14:27
Die Delphi-WSDL/SOAP-Implementierungen sind in älteren Delphi-Versionen für Real-Life-Schnittstellen unbrauchbar da zu fehlerhaft/zu wenig interoperable.
MS hat ein Toolkit veröffentlich um zu bestehenden WSDL/SOAP-Schnittstellen einen COM-Wrapper bereitzustellen (Download-URL im Moment mir nicht mehr geläufig). Dieser düfte relativ Problemlos verwendbar sein.
DerNetteNachbar - Mo 05.01.09 15:23
Ich benutze Delphi 7 bzw. Delphi 2007 und andere Schnittstellen wie Google klappen einwandfrei.
DerNetteNachbar - Di 06.01.09 10:08
PUSH
DerNetteNachbar - Di 06.01.09 13:31
Kennt jemand diesen Com Wrapper? bzw. wie man diesen verwendet?
MfG
DerNetteNachbar - Mi 07.01.09 10:43
Ich konnte da leider nicht sehr viel rauslesen. Kennt Ihr vielleicht paar Sample Codes für Delphi?
MfG
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!