Ich habe den Qingming Festival Holiday verwendet, um den relevanten Inhalt des Webdienstes zu überprüfen, und fasste das Arbeitsprinzip kurz zusammen. Als Referenz durch Freunde in Not und sich in Zukunft. Wenn es einen unangemessenen Artikel gibt, bitten Sie Ihre Freunde, wertvolle Vorschläge zu geben, um sich gegenseitig zu ermutigen.
In Webdiensten sollten wir zunächst die Bedeutung verwandter Begriffe verstehen: WSDL, UDDI .... Die Einführung verwandter Begriffe wird hier nicht wiederholt, aber der Fokus wird im Prinzip stehen.
In einem Webdienst gibt es drei Rollen: Serviceanbieter, Serviceanforderung und Service -Vermittler. Die Beziehung zwischen den drei ist in Abbildung 1-1 dargestellt
Die Implementierung eines vollständigen Webdienstes enthält die folgenden Schritte:
◆ Webdienstanbieter entwerfen und implementieren Webdienste und veröffentlichen das korrekte Debuggen des Webdienstes über den Webdienst Intermediary und registrieren Sie ihn im UDDI -Registrierungszentrum. (Veröffentlichen)
◆ Der Web -Service -Antragsteller fordert einen bestimmten Dienst vom Webdienst -Vermittler an, und der Vermittler fragte das UDDI -Registrierungszentrum auf der Grundlage der Anfrage, einen Dienst zu finden, der der Anfrage erfüllt. (Entdeckung)
◆ Der Webdienst Intermediary gibt die Informationen zur Beschreibung des Webdienstes zurück, die die Bedingungen an den Webdienstantragsteller erfüllen. Die Beschreibungsinformationen werden in WSDL geschrieben und können von verschiedenen Maschinen gelesen werden, die Webdienste unterstützen. (Entdeckung)
◆ Verwenden Sie die vom Web Service Intermediary zurückgegebenen Beschreibungsinformationen (WSDL), um entsprechende SOAP -Nachrichten zu generieren und sie an den Webdienstanbieter zu senden, um den Anruf des Webdienstes zu realisieren. (Bindung)
◆ Der Webdienstanbieter führt den entsprechenden Webdienst gemäß der SOAP -Nachricht aus und gibt das Serviceergebnis an den Web -Service -Anforderer zurück. (Bindung)
Abbildung 1-1 Webdienstarchitektur
Hinweis: Die Funktion von WSDL ist ein Webdiensthandbuch. Der Service -Antragsteller generiert die entsprechende SOAP -Nachricht basierend auf dieser WSDL. Nach Erhalt der SOAP -Anforderungsnachricht bindet der Dienstanbieter den Dienst.
Der folgende Code ist die Servlet -Konfiguration in web.xml
<!- Bei der Formulierung von Initialisierungsparametern oder benutzerdefinierten URLs auf Servlet- oder JSP-Seiten müssen Sie die SEFERLET- oder JSP-Seite nennen. Das Servlet -Element wird verwendet, um diese Aufgabe zu erledigen. -> <servlet> <servlet-name> userservice </servlet-name> <servlet-classe> com.sun.xml.ws.transport.http.servlet.wsServlet </Servlet-Klasse> <! Wenn es gestartet wird, wird der Server im Allgemeinen eine Standard-URL für das Servlet, wenn der Server im Allgemeinen eine Standard-URL ist, wenn es gestartet wird: <Servlet-Mapping> <Servlet-name> UserService </Servlet-name> <! Der grüne Abschnitt ist die externe Schnittstelle des Dienstes. Suchen Sie die entsprechende JAX-Ws.xml-Datei (wie unten gezeigt) <Endpoint Name = "UserPort" Implementierung = "cn.ujn.service.userService" url-pattern = "/user"> </Endpoint>
Es ist dann an die relevante entsprechende Implementierungsklasse cn.ujn.service.userService gebunden. Die vom Client gesendete SOAP -Anforderungsnachrichtskörper enthält den vom Client angeforderten Methodennamen und Parameterinformationen.
Im Folgenden ist die vom Client eingekapsierte SOAP -Meldungsgremium (Datenübertragung mit dem Server im JSON -Modus) (SOAP -Wiederquestumschlag):
<Soapenv: Umschlag xmlns: soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: q0 = "http://ujn.cn/" xmlns: xsd = "http xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance">- <soapenv: body>- <q0: login> <arg0> {"Benutzername": "shq", "Passwort": "shq"} </arg0> </q0: lougin </soapenv: Umschlag> Das Folgende ist das SOAP1.1 -Protokoll, das den Webdienst aufruft
/*** Aufrufen des Webdienstes über das SOAP1.1 -Protokoll** text/xml Dies basiert auf dem SOAP1.1 -Protokoll** @param WSDL WSDL PATH* @PARAM -Methode -Methode -Methode -Name* @param namespace namespace* @param HeaderParameters Header -Parameters -Börse @Parametarameters. Parameter, ob es einen Namespace für den Körperparameter gibt // entfernen? WSDL = WSDL.Substring (0, Länge - 5); // URL -Instanz mit String als Parameter url = neue URL (WSDL) erstellen; // Verbindung erstellen httpurlConnection conn = (httpurlConnection) url.openconnection (); // Setzen Sie die Anforderungsmethode Conn.SetRequestMethod ("Post"); // Wenn Sie vorhaben, eine URL -Verbindung für die Eingabe zu verwenden, setzen Sie das DOInput -Flag auf True Conn.SetDoInput (True). // Wenn Sie vorhaben, eine URL -Verbindung für die Ausgabe zu verwenden, setzen Sie das DOInput -Flag auf true conn.setDooutput (true). // Legen Sie das Attribut (KV) hauptsächlich in der httpurlConnection-Anforderung an Conn.SetRequestProperty ("Content-Typ", "text/xml; charSet = utf-8"); // den Eingangsstream (relativ zum Client, verwenden Sie OutputStream) outputStream out = conn.getOutputStream (); // Erhalten Sie die SOAP1.1 -Version Meldung StringBuilder sb = new StringBuilder (); SB.Append ("<SOAP: Envelope Xmlns: xsi =/" http://www.w3.org/2001/xmlschema-instance/ "xmlns: xsd =/" http://www.w3.org/2001/xmlsschema/ " xmlns: soap =/"http://schemas.xmlsoap.org/soap/envelope//" "); sb.Append ("xmlns: ns0 =/" " + namespace +"/""); sb.Append (">"); // den Nachrichtenheader if (Headerparameter! für (Eintrag <String, String> HeaderParameter: HeaderParameters .EntrySet ()) {sb.append ("<ns0:"); sb.Append (HeaderParameter.getKey ()); sb.Append (">"); sb.Append (HeaderParameter.getValue ()); sb.Append ("</ns0:"); sb.Append (HeaderParameter.getKey ()); sb.Append (">"); } sb.append ("</soap: header>"); } // montieren Sie die Nachrichtenkörper sb.append ("<SOAP: Body> <ns0:"); sb.Append (Methode); sb.Append (">"); // Eingabeparameter if (bodyparameter! sb.Append (inputParameter.getKey ()); sb.Append (">"); sb.Append (inputParameter.getValue ()); sb.Append ("</ns0:"); sb.Append (inputParameter.getKey ()); sb.Append (">"); } else {sb.append ("<"); sb.Append (inputParameter.getKey ()); sb.Append (">"); sb.Append (inputParameter.getValue ()); sb.Append ("</"); sb.Append (inputParameter.getKey ()); sb.Append (">"); }}} sb.append ("</ns0:"); sb.Append (Methode); SB.Append ("> </SOAP: Body> </SOAP: Umschlag>"); // Test System.out.println (sb.tostring ()); // SOAP -Nachrichten schreiben (relativ zum Client, out.write () wird verwendet) out.write (sb.toString (). GetBytes ()); // den entsprechenden Int -Code auf der server seite = conn.getresponsecode () abrufen; if (code == 200) {inputStream is = conn.getInputStream (); Byte [] B = neues Byte [1024]; int len = 0; SoapofResult = new StringBuffer (); // Lesen Sie eine bestimmte Anzahl von Bytes aus dem Eingabestream und speichern Sie sie im Pufferarray b. Gibt die tatsächliche Anzahl der als Ganzzahl gelesenen Bytes zurück // Wenn keine Bytes verfügbar sind, da der Stream am Ende der Datei liegt, beträgt der Wert -1; while ((len = is.read (b))! = -1) {// konvertiert das Byte -Array mit dem benannten Zeichen in eine Zeichenfolge. String S = New String (B, 0, Len, "UTF-8"); SoapofResult.Append (s); }} conn.disconnect (); return soapofresult == null? NULL: SoapofResult.toString (); } Hinweis: Der Client ist nach dem Senden der SOAP -Anforderungsnachricht blockiert. Bis der Server den Statuscode zurückgibt.
Das Folgende ist die Serverantwort (SOAP -Antwortumschlag):
<S: Umschlag xmlns: s = "http://schemas.xmlsoap.org/soap/envelope/">-<s: body>-<ns2: loginresponse xmlns: ns2 = "http://ujn.cn/" <return> </return> </return </S: Body> </s: Umschlag>
Nach dem Empfangen der vom Server gesendeten JSON -Daten führt der Client entsprechende Parsingvorgänge aus. wie folgt:
// Das SOAP -Protokoll analysieren (DOM -Analyse kann nur zur Analyse von XML -Dokumenttypen verwendet werden, während SOAP -Nachrichten im XML -Datenformat dokument document doc = xmlutil.string2doc (Ergebnis); Element ele = (Element) doc.getElementsByTagName ("return"). Element (0); Die in der Methode verwendete String2Doc () -Methode lautet wie folgt: öffentliches statisches Dokument String2Doc (String Str) {// Das XML -Dokument in ein DOM -Baum -DocumentBuilderFactory Factory = DocumentBuilderFactory.Newinstance () analysieren; Document document = null; DocumentBuilder Build; if (str == null || str.equals ("")) {return null; } try {InputStream bais = new bytearrayInputStream (str.getBytes ("utf-8")); Build = factory.newdocumentBuilder (); // analysieren Sie den Inhalt des angegebenen InputStream als XML -Dokument und geben Sie ein neues DOM -Dokumentobjekt zurück. document = Build.Parse (BAIS); } catch (Ausnahme e) {e.printstacktrace (); } Rückgabedokument; } Nach dem Rückgabeergebnis führt der Client die entsprechende Verarbeitung durch.
Das obige ist das grundlegende Arbeitsprinzip der Webdienste.
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!