J'ai utilisé les vacances du Qingming Festival pour revoir le contenu pertinent du service Web et résumé brièvement son principe de travail. Pour référence par des amis dans le besoin et eux-mêmes à l'avenir. S'il y a un article inapproprié, veuillez demander à vos amis de donner de précieuses suggestions pour s'encourager mutuellement.
Dans les services Web, nous devons d'abord comprendre la signification des termes connexes: WSDL, UDDI .... L'introduction de termes connexes ne sera pas répétée ici, mais l'accent sera mis sur le principe.
Dans un service Web, il y a trois rôles: le fournisseur de services, le demandeur de services et l'intermédiaire de service. La relation entre les trois est illustrée à la figure 1-1
La mise en œuvre d'un service Web complet comprend les étapes suivantes:
◆ Les fournisseurs de services Web conçoivent et implémentent des services Web, et publiez le débogage correct du service Web via l'intermédiaire de service Web et enregistrez-le dans le centre d'enregistrement UDDI; (Publier)
◆ Le demandeur de service Web demande un service spécifique de l'intermédiaire de service Web et l'intermédiaire interroge le centre d'enregistrement UDDI en fonction de la demande de recherche d'un service qui répond à la demande; (Découverte)
◆ L'intermédiaire du service Web renvoie les informations de description du service Web qui remplit les conditions du demandeur de service Web. Les informations de description sont écrites en WSDL et peuvent être lues par diverses machines qui prennent en charge les services Web; (Découverte)
◆ Utilisez les informations de description (WSDL) renvoyées de l'intermédiaire de service Web pour générer des messages de savon correspondants et les envoyer au fournisseur de services Web pour réaliser l'appel du service Web; (obligatoire)
◆ Le fournisseur de services Web exécute le service Web correspondant en fonction du message SOAP et renvoie le résultat du service au demandeur de service Web. (Obligatoire)
Figure 1-1 Architecture de service Web
Remarque: La fonction de WSDL est un manuel de service Web. Le demandeur de service génère le message de savon correspondant en fonction de ce WSDL. Après avoir reçu le message de demande SOAP, le fournisseur de services lie le service.
Le code suivant est la configuration du servlet dans web.xml
<! - Lors de la formulation de paramètres d'initialisation ou d'URL personnalisés aux pages servlet ou jsp, vous devez prénommer le servlet ou la page JSP. L'élément servlet est utilisé pour terminer cette tâche. -> <Serplet> <Servlet-name> UserService </vrlet-name> <servlet-class> com.sun.xml.ws.transport.http.servlet.wsservlet </ servlet-class> <! - Marquez si le conteneur charge ce servlet lorsque elle est lancée (Instand et appelle sa méthode init (); la plus petite valeur de la valeur du numéro positif, le plus haut de la méthode, la méthode init (); L'application est d'abord lancée -> <hargeon-sur-startup> </ Load-on-startup> </ servlet> <! <Servlet-Mapping> <Servlet-Name> UserService </ Servlet-name> <! - Décrit l'URL par rapport à la racine de l'application Web. La section verte est l'interface externe du service. Recherchez le fichier jax-ws.xml correspondant (comme illustré ci-dessous) <endpoint name = "utilisateur" implémentation = "cn.ujn.service.userservice" url-potern = "/ user"> </ endpoint>
Il est ensuite lié à la classe d'implémentation correspondante pertinente CN.Ujn.Service.UserService. Le corps du corps du message de demande de SOAP envoyé par le client contient le nom de la méthode et les informations des paramètres demandées par le client.
Ce qui suit est le corps de message SOAP encapsulé par le client (transmission de données avec le serveur en mode JSON) (enveloppe de remercie SOAP):
<soapenv: enveloppe xmlns: soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: q0 = "http://ujn.cn/" xmlns: xsd = "http://www.w3.org/2001/xmlema" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance"> - <soapenv: body> - <q0: ligin> <gg0> {"username": "shq", "mot de passe": "shq"} </gr0> </0: login> </ soapenv: body> </ soapenv: enveloppe> Ce qui suit est le protocole SOAP1.1 invoquant le service Web
/ ** * Appeler le service Web via le protocole SOAP1.1 * * Texte / XML Ceci est basé sur le Protocole SOAP1.1 * * @param wsdl wsdl Path * @param méthode Méthode Nom * @param namespacepacepace * @param headteraMeters HeadParAmètres Paramètre * @Param BodyParametters Body Paramet * @Param IsBodyParaMeterSn Il existe un espace de noms pour le paramètre du corps * @return String * @throws exception * / public static String invokeBySOA11 (String wsdl, string Method, String namespace, map <string, string> headerParameters, map <string> bodyParameters, boolean isbodyParametersns) throws exception exception {StringBuffer soapofult = null; // supprime? Wsdl, obtenez la liste des méthodes int length = wsdl.length (); wsdl = wsdl.substring (0, longueur - 5); // Créer une instance d'URL avec la chaîne comme paramètres url url = new URL (wsdl); // Créer une connexion httpurlConnection Conn = (httpurlConnection) url.openconnection (); // Définissez la méthode de demande Conn.SetRequestMethod ("Post"); // Si vous prévoyez d'utiliser une connexion URL pour l'entrée, définissez l'indicateur DOInput sur True Conn.SetDoInput (true); // Si vous prévoyez d'utiliser une connexion URL pour la sortie, définissez l'indicateur DOInput sur true Conn.SetDoOutput (true); // définit principalement l'attribut (kv) dans l'en-tête de demande httpurlconnection conn.setRequestProperty ("contenu-type", "text / xml; charset = utf-8"); // Obtenez le flux d'entrée (par rapport au client, utilisez outputStream) outpoream out = Conn.getOutputStream (); // Obtenez la version SOAP1.1 STRAGNEDDER STRAGNER SB = new StringBuilder (); SB.APPEND ("<SOAP: Enveloppe XMLNS: XSI = /" http://www.w3.org/2001/xmlschema-instance/ "xmlns: xsd = /" http://www.w3.org/2001/xmlschema/ " xmlns: soap = / "http://schemas.xmlsoap.org/soap/envelope//" "); sb.append ("xmlns: ns0 = /" "+ namespace +" / ""); SB.APPEND (">"); // Assemblez l'en-tête du message if (HeaderParameters! = Null) {sb.append ("<soap: header>"); pour (entrée <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: en-tête>"); } // Assemblez le corps du message SB.APPEND ("<Soap: Body> <ns0:"); SB.APPEND (méthode); SB.APPEND (">"); // Paramètre d'entrée if (bodyParameters! = Null) {pour (entrée <string, string> inputParameter: bodyParameters .EntrySet ()) {if (isBodyParametersns) {sb.append ("<ns0:"); 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 (méthode); sb.append ("> </ soap: body> </ soap: enveloppe>"); // Test System.out.println (sb.toString ()); // Écrivez des messages SOAP (par rapport au client, out.write () est utilisé) out.write (sb.toString (). GetBytes ()); // Obtenez le code int correspondant du côté serveur = Conn.getResponSECOD (); if (code == 200) {inputStream est = conn.getInputStream (); octet [] b = nouveau octet [1024]; int len = 0; soapofResult = new StringBuffer (); // Lisez un certain nombre d'octets du flux d'entrée et stockez-les dans le tableau tampon b. Renvoie le nombre réel d'octets lus comme un entier // s'il n'y a pas d'octets disponibles car le flux est à la fin du fichier, la valeur est -1; while ((len = is.read (b))! = -1) {// Convertit le tableau d'octet en une chaîne en utilisant le charme nommé. String s = new String (b, 0, len, "utf-8"); SOAPOFRESULT.APPEND (S); }} conn.disconnect (); return soapofresult == null? null: soapofresult.toString (); } Remarque: le client est bloqué après l'envoi du message de demande de savon. Jusqu'à ce que le serveur renvoie le code d'état.
Voici la réponse du serveur (enveloppe de réponse SOAP):
<S: enveloppe xmlns: s = "http://schemas.xmlsoap.org/soap/envelope/"> - <s: body> - <ns2: LoginResponse xmlns: ns2 = "http://ujn.cn/"> <retour> 1 </peetur> </ ns2: LOGINRESPONSE> </ S: corps> </ s: enveloppe>
Après avoir reçu les données JSON envoyées par le serveur, le client effectuera des opérations d'analyse correspondantes. comme suit:
// analyse le protocole SOAP (l'analyse DOM ne peut être utilisée que pour analyser les types de documents XML, tandis que les messages SOAP sont au format de données XML) document DOC = xmlutil.string2doc (résultat); Element ele = (élément) doc.getElementsByTagName ("return"). Item (0); La méthode String2Doc () utilisée dans la méthode est la suivante: Document statique public String2Doc (String Str) {// analyse le document XML dans un arbre Dom DocumentBuilderFactory Factory = DocumentBuilderFactory.NewInstance (); Document document = null; Build de documentbuilder; if (str == null || str.equals ("")) {return null; } try {inputStream bais = new ByteArrayInputStream (str.getBytes ("utf-8")); build = factory.newDocumentBuilder (); // Analyser le contenu de l'entrée donné en tant que document XML et renvoie un nouvel objet de document DOM. document = build.parse (bais); } catch (exception e) {e.printStackTrace (); } document de retour; } Selon le résultat de retour, le client effectuera un traitement correspondant.
Ce qui précède est le principe de travail de base des services Web.
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!