Thursday 28 September 2017

Soapui Content Transfer Encoding Binär Optionen


Ich bin in einem losen Ende, wie man einen Anhang in meiner SOAP-Anfrage hinzufügen. Wir müssen einen Thrid-Party-Web-Service verbrauchen, der in Java gebaut ist. Das ist das verworrene Ding, das ich je gesehen habe. Alle anderen Web-Services, die wir verwendet haben, die erforderlichen Anhänge, haben eine Methode oder Eigenschaft, um die Anlage hinzuzufügen. Einfach. Dies stellt jedoch keine solche Methode zur Verfügung. Wir haben eine Version der SOAP-Nachricht zusammen, genau so wie wir das XML wollen, aber das ist der MIME-Teil der Datei, den wir nicht hinzufügen können. Dies ist der XML-Teil, den wir generieren und abschicken können, aber es ist falsch, da wir einen MIME-Teil da drin brauchen: Ich habe das Internet für Antworten geholt, aber es ist leer geworden. Es scheint nicht, viel Dokumentation um mit WSE für diese zu sein. Ich muss betonen, dass WSE eine Anforderung auf der Serverseite ist, und es gibt keine Möglichkeit, dass ich die Technologie ändern kann, um dieses Problem zu lösen. Gibt es eine Möglichkeit, dass diese MIME-Abschnitte hinzugefügt werden können EDIT: Ich muss hinzufügen, dass ich ein funktionierendes XML-Dokument erhalten kann, das durch SoapUI mit Anhängen gesendet wird, aber kann nicht scheinen, einen Weg innerhalb unseres Codes zu finden. Ich habe eine Prämie hinzugefügt, um zu versuchen, eine Lösung für dieses Problem zu bekommen. Wenn jemand irgendwelche anderen Ideen hat, lass es mich wissen. EDIT wieder: Ich weiß, es ist eine Woche her, seit ich in der Lage war, die Antworten hier zu überprüfen, aber während einige eine gute Idee geben, wo ich hinschaue, bin ich immer noch ein Leerzeichen. Die schreckliche Dokumentation rund um XopDocument und seine Methoden ist ein großer Hingabepunkt, wenn jemand irgendwelche Beispiele für die Verwendung von SaveToXopPackage haben könnte sie bitte vorsehen, weil dies beginnt zu reden gefragt Dec 20 11 um 11:48 Nun John, wie wäre es mit einer Lösung zu kommen Anstatt dich nur vorzutäuschen, dass du alles weißt. In diesem Szenario ist für mich WSE erforderlich. Ohne sie werden unsere Anfragen abgelehnt. Ich kann dem Drittanbieter erzählen, wie sie kodieren sollten, ich kann es versuchen, aber sie waren immer die am wenigsten hilfsbereite Gesellschaft in der Welt, um zu arbeiten. Also, während WSE nicht verwendet werden sollte, wenn Sie Ihre eigene Software erstellen, ist es eine Voraussetzung in diesem Fall. Ndash anothershrubery Jan 5 12 at 10:49 Ich habe wenig zu sagen, außer dass ich hoffe, jemand hat dem Kaiser gesagt, seine Kleider sind veraltet. Auch wenn du vorgibst, dass mit WSE keine Option ist, dann wirst du zweifellos lernen, wie man WCF anpasst, um zu tun, was du brauchst, nur durch die Verwendung von unterstützter Software. Ndash John Saunders Ich denke, dass Sie vielleicht ein paar Optionen haben: 1) Verwenden Sie MTOM. Dies scheint automatisch die ausgehende Nachricht in MIME-Blöcken zu verpacken. 2) Microsoft bietet tatsächlich Unterstützung für die Erzeugung und das Lesen von XOP mit Mime durch die XopDocument-Klasse, was ist, was SoapEnvelope erbt. Allerdings denke ich, dass dieser Ansatz kann verlangen, dass Sie das Senden der Nachricht selbst durch eine HttpWebRequest durchführen. Dieses Blog hat ein Beispiel dafür, wie man das implementiert. Der Nachteil ist, dass dies erfordert eine Menge von zusätzlichen Code und Konfiguration, um richtig zu funktionieren. Die ideale Lösung wäre, den Code abzufangen, der die Hüllkurvenübertragung durchführt, aber ich war nicht in der Lage, den richtigen Ort dafür in der Pipeline zu finden. Im 90 zuversichtlich Ich arbeite an genau das gleiche Projekt wie Sie Jungs. Diese Seifenanforderung ist ein wenig zu vertraut :-) Weve hat die meiste Zeit dort durch Umschalten auf WCF und grundsätzlich Hand-Codierung des Anforderungsobjekts (Erstellen von Klassen, die mit dem Seifenformat übereinstimmen und dann mit xmlelement Attributen zu verzieren, so dass es Sieht aus wie ihre Seifenanfrage. Die Datei selbst wird als Byte () auf der Attachment Klasse deklariert und auch mit dem xmlelement verziert). Heres, was der WCF-Vertrag und ein Teil des Datenmodells aussehen. Das eigentliche Datenmodell hat eine Reihe von zusätzlichen Klassen (Application Area, Data Area, Job, etc.), aber das gibt Ihnen genug von einem Gefühl, wie seine strukturiert. Das wichtigste Stück ist die Datei als Byte (). Hier ist es in Vb. Als nächstes hast du deinen WCF-Client, das ist so ziemlich das gleiche wie alle WCF-Clients. Endlich hast du die App. config. Heres die Magie, weil er sagte WCF zu verwenden Mtom, um die Nachricht zu senden. Dies wird das Byte () nehmen und es in einen separaten MIME-Abschnitt strecken, der es durch einen XOP ersetzt: Include. Beachten Sie, dass für jetzt Im nur senden es durch localhost so kann ich die Anfrage mit tcpTrace sehen. Sie können Google diese App aber itll grundsätzlich erfassen die Anfrage, damit wir sehen können, wie es aussieht. Ich setup tcpTrace, um auf Port 84 zu hören. Schließlich, Heres der eigentliche Aufruf an den WCF-Client, um die Anfrage zu machen. Und heres die Spur, die wir durch tcpTrace bekommen haben. Es hat die Grundstruktur richtig und es gelang es, die Binärdaten aus der xml zu ziehen und sie in einen separaten MIME-Bereich zu legen. Wie ich schon erwähnt habe - wir haben noch einige Probleme. Es gibt einige Tags, die aus dem Seifenheader fehlen. Aber ich denke gut, dass man das herausfinden kann. Das eigentliche Problem ist, dass die Content-ID NICHT in einem Format ist, das unser Partner akzeptieren kann - sie erwarten etwas wie lt1.a33c2d7e84634122705ebc71e53d95d4c2683d726ba54e14apache. org und formatieren sie als tempuri. org1634618782531246992. Dies verursacht, dass ihre Web-Service-Handler zum Absturz bringen, weil es nicht weiß, wie man escaped Content-IDs in der Seifen-Nachricht zu lesen. Antwortete Jan 7 12 um 0:23 Habe gerade bemerkt, dass du dies jetzt bearbeite. Ja, es sieht aus wie genau das gleiche Projekt Leider ist deine Lösung nicht in unserem Fall zu arbeiten, da wir uns auf WSE und nicht WCF beschränken. Reliance auf VS 2005. Es ist ein Schmerz. Aber das ist das Ergebnis, das ich suche, aber muss die Lösung in WSE herausfinden. (Mit deinem Problem kannst du aber die Content-ID nicht auf alles einstellen, was du willst. Das funktioniert in SoapUI, wenn du die Content-ID selbst spezest und nicht auf die Standarddarstellung verweist. Meine E-Mail-Adresse, keine Arbeit, ist in meinem Profil, wenn du weiter reden willst ndash anothershrubery Wie du sagst, du hast es durch SoapUI gearbeitet, ich würde denken, du kannst einfach soapUI für das erzeugte XML fragen, das du gesendet hast, also weißt du, wie es aussehen sollte Ändern Sie Ihren Code, um das zu imitieren UPDATE: nach Ihrem Kommentar und lesen Sie die anderen Antworten im Detail: Die Lösung sieht mir einfach nur Bytes direkt, mit HttpWebRequest wie in Ktsioliss Antwort. Im Detail: Erstellen Sie Ihre SOAP-XML (das Beispiel, das Sie gab ), Kodiere dies in Bytes in UTF8 (1) Erstellen Sie einen String mit dem anfänglichen Mimeboundary (der Teil in Ihrem Before XML), kodieren Sie zu Bytes in UTF8 (2) Erstellen Sie die Bytes für die zweite Mimeboundary (das Teil in nach XML). So erstellen Sie die Zeichenfolge mit --MIMEBOUNDARY etc. codieren zu UTF8 Bytes und fügen Sie alle Bytes Ihrer test. gif Datei (3) Anhängen Sie alle Bytes in der Reihenfolge (2), (1) und (3) und senden Sie diese über die Draht. Sollte dies nicht der Trick Ok, so habe ich es, um die Daten aus der Datei in der ltgwm: Filegt Element zu akzeptieren. Das ist ohne Verwendung von XOP, also sieht die Anforderung nun wie folgt aus: Wenn sie in SoapUI übergegangen ist, funktioniert das einwandfrei, aber im Code gibt es eine Antwort, aber es wirft einen Fehler aus, dass Response nicht gut geformtes XML ist. Mit einer inneren Ausnahme von WSE1608: Es gab keine XOP-Teile im Stream für die angegebene Content-ID: ltrootpart36875c60-630c-4e23-9e74-f9a9c7547fc7example. jaxws. sungt Ich werde eine neue Frage dazu bekommen, da es technisch anders ist Problem. Ich bin in genau das gleiche Projekt beteiligt und ich habe die gleichen Themen wie in diesem Thread diskutiert Ich bin mit VB 2005 und WSE 3.0 Verbesserungen und ich habe es funktioniert auch es ist ein Schmerz für jetzt. Beim Schreiben des Inhalts der Datei direkt in der Dateieigenschaft wird der Anhang vom Partner übernommen. In meinem Fall funktioniert das für fast alle Transaktionen außer PRAs. Hier ist die Antwort positiv und ein AttachmentID wird ausgeliefert, aber der Anhang erscheint nicht in der Transaktion. Hier ist ein Beispiel für die Attachment-Sektion: Wenn ich RequireMtom für den Service auf True setze, bekomme ich folgende Fehlermeldung: Das Prfix kann nicht von in starstandards. orgwebservices200510transport innerhalb desselben Startelementtags neu definiert werden. Einerseits, es funktioniert, auf der anderen Seite bin ich mir nicht sicher, ob es mit XOP-Elementen geschickt wird. Antwortete am 17. Januar 12 um 12:46 Ich hatte eine Diskussion mit den Web-Service-Entwickler über das Setzen der Daten direkt in das ltFilegt-Element und sie sagten, dies entspricht nicht ihrer Spezifikation und sie benötigen ein ltxop: Includegt Element. Siehe Stackoverflowquestions8805095hellip für eine weitere Beschreibung des Problems, das wir haben. Wenn du weiter draußen diskutieren willst, findest du mein Profil für meine E-Mail-Adresse. Ndash anothershrubery Jan 17 12 at 12:59 Sicher. Aber ich kann deine E-Mail-Adresse nicht finden. Ndash Daniel Schlieckmann Jan 17 12 at 15:43 Wenn du es unter Bio sehen kannst, ist es jetzt in der Info über mich in meinem Profil. Ndash anothershrubery Vielen Dank. Ich habe dir eine E-Mail geschickt. Ndash Daniel Schlieckmann Jan 18 12 at 15:24 Deine Antwort 2017 Stack Exchange, Informieren von SOAP zum Senden von Binärdaten Unsere bisherigen Meldungen sind ziemlich klein gewesen, aber wir können uns leicht vorstellen, SOAP zu verwenden, um große Binärblöcke von Daten zu senden. Zum Beispiel betrachten eine automatisierte Versicherungsanspruchregistrierung151remote-Agenten könnten SOAP-fähige Software verwenden, um neue Ansprüche an einen zentralen Server zu übermitteln, und ein Teil der Daten, die mit einem Anspruch verbunden sind, könnten digitale Bilder sein, die Schäden oder die Umgebung um einen Unfall aufzeichnen. Da XML can039t direkt echte 8-Bit-Binärdaten kodieren kann, ist eine einfache Möglichkeit, diese Art von Ding zu tun, vielleicht die Verwendung des XML-Schema-Typs base64binary und codieren Sie Ihre Bilder als base64-Text im XML: Diese Technik funktioniert, aber it039s nicht Besonders effizient in Bezug auf die Bandbreite, und es erfordert die Bearbeitungszeit, um Bytes zu und von base64 zu codieren und zu decodieren. E-Mail hat den Multipurpose Internet Mail Extensions (MIME) Standard seit einiger Zeit verwendet, um diesen Job zu machen, und MIME ermöglicht die Codierung von 8-Bit-Binärdateien. MIME ist auch die Basis für einige der Datencodierung, die in HTTP verwendet wird, da HTTP-Software in der Regel mit MIME umgehen kann, es könnte nett sein, wenn es eine Möglichkeit gibt, das SOAP-Protokoll mit diesem Standard zu integrieren und eine effizientere Möglichkeit, binäre Daten zu senden. SOAP mit Attachments und DIME Ende 2000 veröffentlichten HP und Microsoft eine Spezifikation namens quotSOAP Messages mit Attachments. quot Die Spezifikation beschreibt eine einfache Möglichkeit, die Multiref-Codierung in SOAP 1.1 zu verwenden, um auf MIME-codierte Anhangsteile zu verweisen. Wir sind hier genau hingegangen, wenn du die Spezifikation lesen möchtest, kannst du es bei w3.orgTR2000NOTE-SOAP-Attachments-20001211 finden. Die Grundidee hinter SOAP mit Attachments (SwA) ist, dass du denselben HREF-Trick benutzt hast, den du im Abschnitt quotObject Graphs gefunden hast, um einen Verweis auf die Daten in der SOAP-Nachricht einzufügen, anstatt sie direkt zu codieren. Im SwA-Fall verwenden Sie jedoch die content-id (cid) des MIME-Teils, der die Daten enthält, die Sie als Referenz anstelle der ID einiger XML interessieren. Also, die Nachricht kodiert früher würde so etwas aussehen: Eine andere Technologie namens Direct Internet Message Encapsulation (DIME). Von Microsoft und IBM, eine ähnliche Technik verwendet, außer dass die On-the-wire-Codierung kleiner und effizienter als MIME war. DIME wurde der IETF im Jahr 2002 vorgelegt, hat aber seitdem sogar die ursprünglichen Autoren unterstützt. SwA und DIME sind große Technologien, und sie bekommen die Arbeit erledigt, aber es gibt ein paar Probleme. Das Hauptproblem ist, dass sowohl SwA als auch DIME eine Datenstruktur einführen, die explizit außerhalb des Bereichs des XML-Datenmodells liegt. Mit anderen Worten, wenn ein Vermittler die frühere MIME-Nachricht erhielt und den SOAP-Körper digital signieren oder verschlüsseln wollte, würde es Regeln benötigen, die ihm mitgeteilt haben, wie der Inhalt in der MIME-Anlage mit der SOAP-Hüllkurve verknüpft war. Diese Regeln wurden für SwADIME formalisiert. Daher müssen Werkzeuge und Software, die mit dem XML-Datenmodell arbeiten, modifiziert werden, um die SwADIME-Verpackungsstruktur zu verstehen und eine Möglichkeit zu haben, auf die in den MIME-Anhängen eingebetteten Daten zuzugreifen. Verschiedene XML - und Web-Service-Visionäre begannen, die allgemeine Frage der Zusammenführung von binären Inhalten mit dem XML-Datenmodell im Ernst zu diskutieren. Infolgedessen entwickeln sich jetzt mehrere Vorschläge, um dieses Problem architektonisch sauberer zu lösen. PASWA, MTOM und XOP Im April 2003 wurde das Dokument "Proposed Infoset Addendum to SOAP With Attachementsquot (PASWA) g" von mehreren Firmen wie Microsoft, ATampT und SAP veröffentlicht. PASWA führte ein logisches Modell ein, um Binärinhalte direkt in ein SOAP-Infoset zu integrieren. Physikalisch sind die Meldungen, die PASWA beschäftigt, fast identisch mit unseren beiden früheren Beispielen (das Bild codiert zuerst als base64 inline mit dem XML und dann als MIME-Anhang) 151die Differenz ist, wie wir über die Anhänge denken. Anstatt an das MIME-codierte Bild als eine separate Entität zu denken, die explizit in der SOAP-Hüllkurve erwähnt wird, denken wir logisch daran, als ob es noch inline mit dem XML wäre. Mit anderen Worten, die MIME-Verpackung ist eine Optimierung, und Implementierungen müssen sicherstellen, dass Prozessoren, die das SOAP-Datenmodell zum Zwecke der Verschlüsselung oder Signierung betrachten, immer noch die tatsächlichen Daten sehen, als ob sie in der XML-Base-codiert wurden. Im Juli 2003 wurde nach einer langen Reihe von Gesprächen zwischen der XML-Protokollgruppe und den PASWA-Unterstützern der Message Transmission Optimization Mechanism (MTOM) g geboren, im Besitz der XMLP-Gruppe. Es hat die Ideen in PASWA in eine abstrakte Funktion umgestaltet, um besser mit dem SOAP 1.2-Erweiterungsmodell zu synchronisieren und dann eine Implementierung dieser Funktion über HTTP anzubieten. Der Serialisierungsmechanismus heißt XML-Binary Optimized Packaging (XOP) g, der in eine separate Spezifikation aufgenommen wurde, so dass er auch in Nicht-SOAP-Kontexten verwendet werden könnte. Als Beispiel haben wir den früheren Versicherungsanspruch etwas verändert, indem wir das XML mit einem Content-Type-Attribut (aus der XOP-Spezifikation) erweitern, das uns mitteilt, welchen MIME-Content-Typ bei der Serialisierung dieses Infosets mit XOP verwendet wird. Hier ist die neue Version: Eine MTOMXOP-Version unseres modifizierten Versicherungsanspruchs sieht so aus: Im Grunde genommen ist es das gleiche auf dem Draht wie die SwA-Version, aber es nutzt das xop: Includegt Element statt nur das href Attribut. Der wirkliche Unterschied ist architektonisch, da wir uns vorstellen, dass Werkzeuge und APIs diese Nachricht genau so manipulieren, als wäre es ein XML-Datenmodell. MTOM und XOP sind auf dem Weg, von der XML-Protokoll-Arbeitsgruppe im Jahr 2004 freigegeben zu werden, und es bleibt abzuwarten, wie gut sie von der breiteren Nutzergemeinschaft akzeptiert werden. Das frühere Feedback war jedoch sehr positiv, und die Autoren dieses Buches stehen hinter der Idee eines einheitlichen Datenmodells für XML und binäre content. SoapClient :: SoapClient Parameter URI der WSDL-Datei oder NULL, wenn sie im Nicht-WSDL-Modus arbeiten. Während der Entwicklung kann das WSDL-Caching durch die Verwendung der soap. wsdlcachettl php. ini-Einstellung deaktiviert werden. Andernfalls werden Änderungen an der WSDL-Datei nicht wirksam, bis soap. wsdlcachettl abgelaufen ist. Ein Array von Optionen. Bei der Arbeit im WSDL-Modus ist dieser Parameter optional. Wenn Sie im Nicht-WSDL-Modus arbeiten, müssen die Speicherort - und Uri-Optionen festgelegt werden, wobei Standort die URL des SOAP-Servers ist, um die Anforderung zu senden, und uri ist der Zielnamensraum des SOAP-Dienstes. Die Stil - und Nutzungsoptionen funktionieren nur im Nicht-WSDL-Modus. Im WSDL-Modus kommen sie aus der WSDL-Datei. Die Option soapversion sollte entweder SOAP11 oder SOAP12 sein, um SOAP 1.1 bzw. 1.2 auszuwählen. Wenn weggelassen, wird 1.1 verwendet. Für die HTTP-Authentifizierung können die Anmelde - und Kennwortoptionen verwendet werden, um Anmeldeinformationen zu liefern. Für die Herstellung einer HTTP-Verbindung über einen Proxy-Server, die Optionen Proxyhost. Proxy-Port . Proxylogin und proxypassword sind ebenfalls erhältlich. Für die HTTPS-Client-Zertifikat-Authentifizierung verwenden Sie localcert - und passphrase-Optionen. Eine Authentifizierung kann in der Authentifizierungsoption angegeben werden. Die Authentifizierungsmethode kann entweder SOAPAUTHENTICATIONBASIC (Standard) oder SOAPAUTHENTICATIONDIGEST sein. Die Komprimierungsoption ermöglicht die Komprimierung von HTTP-SOAP-Anfragen und Antworten. Die Codierungsoption definiert die interne Zeichenkodierung. Diese Option ändert nicht die Codierung von SOAP-Requests (es ist immer utf-8), sondern konvertiert Strings in sie. Die Trace-Option ermöglicht die Ablaufverfolgung von Anfragen, so dass Fehler zurückverfolgt werden können. Dies ist standardmäßig auf FALSE Die Option classmap kann verwendet werden, um einige WSDL-Typen in PHP-Klassen abzubilden. Diese Option muss ein Array mit WSDL-Typen als Schlüssel und Namen von PHP-Klassen als Werte sein. Die Ausnahmemöglichkeit ist ein boolescher Wert, der festlegt, ob Seifenfehler Ausnahmen vom Typ SoapFault auslösen. Die Option connectiontimeout definiert für die Verbindung zum SOAP-Dienst ein Timeout in Sekunden. Diese Option definiert kein Timeout für Dienste mit langsamen Antworten. Um die Zeit zu beschränken, um auf Anrufe zu warten, um die Einstellung defaultsockettimeout zu beenden, ist verfügbar. Die Option typeemap ist ein Array von Typzuordnungen. Typ-Mapping ist ein Array mit Tasten-Typusame. Typens (namespace URI), fromxml (Rückruf akzeptiert einen String-Parameter) und Toxml (Rückruf akzeptiert einen Objekt-Parameter). Die Option cachewsdl ist eine von WSDLCACHENONE. WSDLCACHEDISK. WSDLCACHEMEMORY oder WSDLCACHEBOTH. Die Option useragent gibt den String an, der im User-Agent-Header verwendet werden soll. Die Features-Option ist eine Bitmaske von SOAPSINGLEELEMENTARRAYS. SOAPUSEXSIARRAYTYPE SOAPWAITONEWAYCALLS. Die Option keepalive ist ein boolescher Wert, der festlegt, ob die Verbindung: Keep-Alive-Header oder Connection: close. Die Option sslmethod ist eine von SOAPSSLMETHODTLS. SOAPSSLMETHODSSLv2. SOAPSSLMETHODSSLv3 oder SOAPSSLMETHODSSLv23. ErrorsExceptions SoapClient :: SoapClient () erzeugt einen EERROR-Fehler, wenn der Speicherort und die uri-Optionen im nicht-WSDL-Modus vorgesehen sind. Eine SoapFault-Ausnahme wird ausgelöst, wenn der wsdl-URI nicht geladen werden kann. Client new SoapClient (some. wsdl) Client neuer SoapClient (some. wsdl. Array (soapversion gt SOAP12)) Client neuer SoapClient (some. wsdl. Array (Login gt somename, Passwort gt somepassword)) Client neuer SoapClient (some. wsdl. Array (Proxyhost gt localhost, Proxyport gt 8080)) Client new SoapClient (some. wsdl. Array (proxyhost gt localhost, proxyport gt 8080, proxylogin gt somename, proxypassword gt somepassword)) Client neuer SoapClient (some. wsdl. Array (localcert gt Certkey. pem)) Client neuer SoapClient (null. Array (Ort gt localhostsoap. php, uri gt test-uri)) Client neuer SoapClient (null. Array (location gt localhostsoap. php, uri gt test-uri, style gt SOAPDOCUMENT, Verwenden Sie gt SOAPLITERAL)) Client new SoapClient (some. wsdl. Array (Kompression gt SOAPCOMPRESSIONACCEPT SOAPCOMPRESSIONGZIP)) Client neuer SoapClient (some. wsdl. Array (Codierung gt ISO-8859-1)) Klasse MyBook public title public author client new SoapClient ( Books. wsdl Array (classmap gt array (book gt MyBook))) User Contributed Notes 56 Notizen Es dauerte länger als eine Woche, um herauszufinden, wie man WSSE (Web Service Security) Header in nativem PHP SOAP implementiert. Es gibt keine viel Ressource auf diesem, so dachte, dies hier für gemeinnützige hinzuzufügen. Schritt 1: Erstellen Sie zwei Klassen, um eine Struktur für WSSE-Header zu erstellen ltphp-Klasse clsWSSEAuth private Benutzername privat Passwort Funktion Konstrukt (Benutzername Passwort) this - gt Benutzername Benutzername dieser - gt Passwort Passwort Klasse clsWSSEToken private BenutzernameToken Funktion Konstrukt (innerVal) this - gt BenutzernameToken innerVal Gt Step2: Seifenvariablen für Benutzername und Passwort erstellen ltphp Benutzername 1111 Passwort 1111 Überprüfen Sie mit Ihrem Provider, welchen Sicherheitsnamenraum sie verwenden. StrWSSENS Schemas. xmlsoap. orgws200207secext objSoapVarUser neu SoapVar (Benutzername XSDSTRING NULL. StrWSSENS NULL. StrWSSENS) objSoapVarPass new SoapVar (Kennwort).Schlüssel, NULL Var ltphp objWSSEAuth new clsWSSEAuth (objSoapVarUser. ObjSoapVarPass) gt Step4: Erstellen von SoapVar aus dem Objekt der Auth-Klasse ltphp objSoapVarWSSEAuth neu SoapVar (objWSSEAuth. SOAPENCOBJECT NULL. StrWSSENS BenutzernameToken strWSSENS) gt Schritt 5: Objekt für Token-Klasse erstellen ltphp objWSSEToken new clsWSSEToken (objSoapVarWSSEAuth) gt Step6: (..... objWSSEToken SOAPENCOBJECT NULL strWSSENS Username strWSSENS) erstellen SoapVar aus Objekt von Token Klasse ltphp objSoapVarWSSEToken neue SoapVar gt Schritt 7: erstellen Sie SoapVar für Sicherheit Knoten ltphp objSoapVarHeaderVal neue SoapVar (objSoapVarWSSEToken SOAPENCOBJECT NULL... StrWSSENS. SchweizSieSprakti_tMPHeHeader (StrWSSENS). Sicherheit. ObjSoapVarHeaderVal. wahr. Abce) Dritter Parameter hier macht mustUnderstand1 Forth Parameter erzeugt actorabce gt Step9: Objekt von Seap Client erstellen ltphp objClient new SoapClient (WSDL. ArrOptions) gt Schritt 10: Header für soapclient Objekt setzen ltphp objClient - gt setSoapHeaders (array (objSoapVarWSSEHeader)) gt Schritt 11 : Endgültiger Aufruf zur Methode ltphp objResponse objClient - gt soapCall (strMethod. RequestPayloadString) gt Eine Anmerkung zu booleschen Werten, die bei der Reflexion offensichtlich erscheinen mag, aber ein Gotcha für einige sein könnte: Wenn man ein SOAP-Anforderungsbeispiel mit ltSomeBooleanParamgttrueltSomeBooleanParamgt sieht, kannst du dich in String übergeben True oder false als der Parameter, der falsch ist - die richtige Methode ist, boolesche Datentypen zu verwenden. Ltphp-Client neue SoapClient (wsdl. Optionen) Methode DoSomething params neue stdClass params - gt SomeBooleanParam TRUE client - gt Methode (params) vereinfachte Anforderung snippet wäre ltSomeBooleanParamgttrueltSomeBooleanParamgt das wird auch richtig sein, aber nicht aus den richtigen Gründen: params - gt SomeBooleanParam true Client - gt-Methode (params) vereinfachte Anforderung Snippet wäre ltSomeBooleanParamgttrueltSomeBooleanParamgt Dies ist, wo Sie vielleicht fragen, was ist auf params - gt SomeBooleanParam false Client - gt Methode (params) vereinfachte Anfrage Snippet wäre ltSomeBooleanParamgttrueltSomeBooleanParamgt Sie müssen dies stattdessen params - Gt SomeBooleanParam FALSE Client - gt-Methode (params) vereinfachte Anforderungs-Snippet wäre ltSomeBooleanParamgtfalseltSomeBooleanParamgt gt Hoffnung, die hilft, wenn man ws-Sicherheit mit einem Nonce und einem Zeitstempel verwenden muss, können Sie dies verwenden: class WsseAuthHeader erweitert das SoapHeader-Funktionskonstrukt (User Pass ) Erstellt gmdate (Ym-dTH: i: sZ) nonce mtrand () passdigest base64encode (pack (H. sha1 (pack (H. nonce). Pack (a. Erstellt). Pack (a. Pass))) auth new stdClass () auth - gt Benutzername neu SoapVar (Benutzer. XSDSTRING. NULL. Dies - gt wssns. NULL. This - gt wssns) auth - gt Passwort new SoapVar (Pass XSDSTRING. NULL. Dies ist - wwns, nwLs, das ist nicht sozusagen, dass es sich um eine neue Sektion handelt. NULL. Dies - gt wssns NULL. Dies - gt wsuns) usernametoken new stdClass () usernametoken - gt UsernameToken new SoapVar (auth. SOAPENCOBJECT. NULL. Dies - gt wssns. BenutzernameToken. This - gt wssns) securitysv new SoapVar (new SoapVar (Usernametoken. SoAPENCOBJECT NULL, das ist - wwns. Konvertieren (diese - gt wssns. Sicherheitssicherheit) und mit deinem SoapClient: ltphp-Client neuer SoapClient (Hostpath) Client - gt setSoapHeaders (Array (neuer WsseAuthHeader (User Pass))) gt funktioniert für mich. Basierend auf einem stackoverlfow Post, der nur den Benutzernamen und das Passwort, nicht die Nonce und die Zeitstempel Es scheint ein Problem mit der Angabe leerer Strings für Proxyhost und Proxyport-Optionen in der letzten Versionen von PHP (ab einer Version später als 5.2.9 und Gleich oder früher als 5.2.11). Die Bereitstellung von leeren Zeichenfolgen für Proxyhost und Proxyport verursacht Host nicht gefunden Typ Fehler: Lieferung von NULL oder FALSE funktioniert gut. Für alle, die Probleme mit ArrayOfxsdstring haben und einen Fehler erhalten, der ähnlich ist Kein Deserializer, der für Array-Typ-String definiert ist Verwenden Sie die Features param, setzen Sie auf SOAPUSEXSIARRAYTYPE - das stellt sicher, dass der richtige Deserializer verwendet wird. ZB ltphp-Client new SoapClient (some. wsdl. Array (Features gt SOAPUSEXSIARRAYTYPE)) gt Beachten Sie, dass die Erstellung eines Seifen-Clients für eine ungültige URL (Sie testen, was passiert, wenn ein Dienst nicht verfügbar ist, rechts) in der Regel eine Ausnahme auslöst Kann mit try..catch gefangen werden. Allerdings, wenn xdebug aktiv ist, bekommst du einen schwerwiegenden Fehler, der offensichtlich nicht gefangen werden kann. SoapFault Ausnahme: Client sieht aus wie wir kein XML-Dokument in ltdocumentgt wurde bereits erwähnt, um auftreten, wenn Ihr Server etwas vor ltxml ausgibt. Gt tag Für alle, die Probleme damit haben, und kein Zugriff auf den Server-Code: Dies ist, wie man einen Proxy, die saubere Antworten für Sie ltphp Einfache Klasse aus einer Notiz von James Ellis in doRequest () Seite der manuellen Klasse ProxyClient erweitert SoapClient genommen Geschütztes cacheDocument public function construct (wsdl. Options) parent. Konstruieren (wsdl. Options) SetCacheDocument () setzt den zuvor zwischengespeicherten Dokumentinhalt public function SetCacheDocument (document) this - gt cacheDocument document doRequest () überschreibt den Standard SoapClient, um eine lokale anfrage öffentliche Funktion zu behandeln doRequest () return this - gt cacheDocument put this Code in deiner Funktion oder wo immer du alle benötigten Variablen hast, set Client neu SoapClient (wsdlurl. Settingsarray) void client - gt Methode (params) nennen dies, um Antwort vom Server zu erhalten, der Client antwortet - gt getLastResponse () dieser Teil entfernt stuff start strpos (responsestring Ltxml) endestring (responsinging gt) responsestring substr (responsestring start start - start 1) bekommst deinen proxy vorbereiteten proxy neuen ProxyClient (wsdlurl. Settingsarray) und fülle ihn mit dem server antwort proxy - gt SetCacheDocument (responsestring) undfinallytheresultis proxy - gt Methode (params) printr (andfinallytheresultis) das erlaubt euch zu sehen, was gibt es Methode ist die Methoden Name zB. MethodgetVersion params - typische params für eine seifenmethode Mit einer WSDL-Datei ist der Weg zu gehen, aber für meine spezielle Anwendung, die LOCATION: PORT musste dynamisch sein, so dass meine SOAP-Clients in der Lage, einen anderen Service auf der Grundlage der Client-Domain Wenn Sie eine WSDL verwenden, benötigt SoapClient () eine URL direkt auf eine aktuelle URL und lässt Sie nicht eine PHP-Datei verwenden, die das dynamische WSDL-XML an ihrer Stelle ausgibt. Also habe ich am Ende eine separate WSDL für jeden möglichen Service benötigt und musste sie alle beibehalten, wenn sich die Servicebeschreibung geändert hat. Schließlich, nach einigen fiddling, war ich in der Lage, eine PHP-Seite mit den richtigen Mime-Typ-Header zu erstellen, so dass ich dann Trick SoapClient () zu denken, dass es eine Datei mit einer Erweiterung. wsdl übergeben wurde. Header (Content-Type: applicationxml charsetUTF-8) header (Content-Disposition: attachment filenamefilename. wsdl) read in file handle fopen (wsdl. R) wsdlxml fread (handle. Dateigröße (wsdl)) fclose (Handle) Code hier setzen Ersetzen url und port in xml Nun, um diese Arbeit zu machen, können Sie nicht einfach einen relativen Pfad zur Datei aufrufen. Ich glaube, es muss durch Apache gehen, um richtig die Mime-Typ Header, etc. So würden Sie eine volle verwenden. Adresse als Pfad zur Datei wsdl. php. . Irgendwo in deinem Seifen-Client-Code soapclient neuer SoapClient (wsdlloc. Clientparamarray) Ein weiterer, vielleicht nicht so sauberer Weg, dies zu erreichen wäre, deine. htaccess-Datei im Verzeichnis zu ändern, in dem deine WSDL-Datei existiert, um die. wsdl-Dateien zu zwingen, PHP-Motor Fügen Sie folgendes Ihrem. htaccess hinzu: AddType applicationx-httpd-php. php. wsdl Sie können dann dynamische PHP-Code-Snippets in Ihre. wsdl-Dateien einfügen, um die Werte zu ändern, die Sie benötigen. Es gibt Vor - und Nachteile für jede Lösung. Die Mime-Lösung steuert wahrscheinlich das System mehr, da es die Datei jedes Mal lesen muss, wenn eine Seifenanforderung gemacht wird. Die htaccess-Lösung macht es so, dass man sich entweder auf eine modifizierte. htaccess - oder Apache-conf-Datei verlassen muss. Vielleicht, wenn Sie die soap. wsdlcacheenabled, mit iniset (), auf 1 (Standard), das Caching wird es so, dass es nicht lesen Sie die Datei jedes Mal für die Mime-Lösung. Ich erlebe die gleichen Probleme beim Versuch, ein WDSL-Fiel zu laden, das durch die grundlegende http-Authentifizierung geschützt ist, da die Parameter Login und das Passwort nur für die Anfrage verwendet werden, aber nicht beim Lesen der wdsl-Datei. Ich benutze nur die folgende Problemumgehung durch das Herunterladen der XML-Datei an einen nicht geschützten Ort auf meinem Server. Bitte beachten Sie, dass dies keine Art von Caching unterstützt. Ltphp-Klasse SoapAuthClient erweitert SoapClient Da das PHP-SOAP-Paket keine grundlegende Authentifizierung unterstützt, lädt diese Klasse die WDSL-Datei mit dem CURL-Paket herunter und erstellt eine lokale Kopie des wdsl auf Ihrem Server. Stellen Sie sicher, dass Sie den folgenden zusätzlichen Parameter in den Optionen Array: wdsllocalcopy gt true Funktion SoapAuthClient (wdsl. Optionen) if (isset (Optionen wdsllocalcopy) ampamp Optionen wdsllocalcopy true ampamp isset (Optionen login) ampamp isset (Optionen Passwort)) Datei md5 ( Uniqid ())..xml if ((fp fopen (this - gt cachedir. datei w)) false) werfe neue Exception (konnte keine lokale WDSL-Datei erstellen (; this - gt cachedir. File.)) Ch curlinit () credit (options login. : (Passwort: Passwort: Passwort vergessen) curlsetopt (ch. CURLOPTURLWELLE) fp) if ((xml curlexec (Ch)) false) curlclose (ch) fclose (fp) unlink (diese - gt cachedir Datei) werfen neue Exception (curlerror (ch)) curlclose (ch) fclose (fp) wdsl this - gt cacheurl. Datei unset (Optionen wdsllocalcopy) unset (Optionen wdslforcelocalcopy) echo wdsl parent. Konvertieren (wdsl. Options) unlink (this - gt cachedir. file) gtFollowing content wird bei TcpMon erfasst: Request made by SoapUI Pro 3.0.2: POST tf6servicesxdsrepositoryb HTTP1.1 Accept-Encoding: gzip, deflate Content-Type: multipartrelated typeapplicationxopxml Start start-infoapplicationsoapxml Aktionsgrenze ---- Part1728349551.1260534830078 MIME-Version: 1.0 User-Agent: Jakarta Commons-HttpClient3.1 Host: ihexds. nist. gov:9080 Inhalt-Länge: 13318 ------ Part1728349551. 1260534830078 Inhalt-Typ: applicationxopxml charsetUTF-8 typeapplicationsoapxml actionProvideAndRegisterDocumentSetRequest Content-Transfer-Encoding: 8bit Content-ID: ------ Part1728349551.1260534830078 Inhaltstyp: textplain charsetus-ascii Content-Transfer-Encoding: 7bit Content-ID: Ltgt Dies ist das Dokument. Antrag von xdstest Werkzeug: POST tf6servicesxdsrepositoryb HTTP1.1 Content-Type: multipartrelated boundaryMIMEBoundaryurnuuid613A2BD2D99F1E6B5912 60534073176 typeapplicationxopxml startlt0.urn: uuid: 613A2BD2D99F1E6B591260534073177 apache. orggt Start-infoapplicationsoapxml actionurn: ihe: iti: 2007 rovideAndRegisterDocumentSet-b User-Agent: Axis2 Host: ihexds. nist. gov:9080 Transfer-Encoding: chunked 20f1 --MIMEBoundaryurnuuid613A2BD2D99F1E6B59126053407 3176 Content-Type: applicationxopxml charsetUTF-8 typeapplicationsoapxml Content-Transfer-Encoding: binary Content-ID: lt0.urn:uuid:613A2BD2D99F1E6B591260534073177apache. orggt --MIMEBoundaryurnuuid613A2BD2D99F1E6B59126053407 3176 Content - Type: textplain Content-Transfer-Encoding: binary Content-ID: lt1. urn:uuid:613A2BD2D99F1E6B591260534073366apache. or g gt This is my document. From where can i set Content-Transfer-Encoding as binary At the nist public registry, you can view the text document which is been sent as an attachment: I have also tried making Encode Attachments as true under TestRequest Properties. But its not working either. Danke für die Hilfe

No comments:

Post a Comment