Utilicé las vacaciones del Festival Qingming para revisar el contenido relevante del servicio web y resumí brevemente su principio de trabajo. Como referencia de amigos necesitados y ellos mismos en el futuro. Si hay algún artículo inapropiado, solicite a sus amigos que den sugerencias valiosas para alentarse mutuamente.
En los servicios web, primero debemos comprender el significado de los términos relacionados: WSDL, UDDI .... La introducción de términos relacionados no se repetirá aquí, pero el enfoque estará en principio.
En un servicio web, hay tres roles: proveedor de servicios, solicitante de servicio y intermediario de servicio. La relación entre los tres se muestra en la Figura 1-1
La implementación de un servicio web completo incluye los siguientes pasos:
◆ Los proveedores de servicios web diseñan e implementan servicios web, y publican la depuración correcta del servicio web a través del intermediario del servicio web y lo registran en el Centro de registro de UDDI; (Publicar)
◆ El solicitante del servicio web solicita un servicio específico del intermediario del servicio web, y el intermediario consulta el Centro de registro de UDDI en función de la solicitud para encontrar un servicio que cumpla con la solicitud; (Descubrimiento)
◆ El intermediario del servicio web devuelve la información de descripción del servicio web que cumple con las condiciones al solicitante del servicio web. La información de descripción está escrita en WSDL y puede ser leída por varias máquinas que admiten servicios web; (Descubrimiento)
◆ Use la información de descripción (WSDL) devuelta del intermediario del servicio web para generar los mensajes SOAP correspondientes y enviarlos al proveedor del servicio web para realizar la llamada del servicio web; (vinculante)
◆ El proveedor de servicios web ejecuta el servicio web correspondiente de acuerdo con el mensaje SOAP y devuelve el resultado del servicio al solicitante del servicio web. (Vinculante)
Figura 1-1 Arquitectura del servicio web
Nota: La función de WSDL es un manual de servicio web. El solicitante del servicio genera el mensaje SOAP correspondiente basado en este WSDL. Después de recibir el mensaje de solicitud SOAP, el proveedor de servicios vincula el servicio.
El siguiente código es la configuración de servlet en web.xml
<!- Al formular los parámetros de inicialización o las URL personalizadas a las páginas Servlet o JSP, debe nombrar la página Servlet o JSP. El elemento servlet se usa para completar esta tarea. -> <servlet> <servlet-name> UserService </servlet-name> <ervlet-class> com.sun.xml.ws.transport.http.servlet.wsservlet </servlet-class> <!-marque si el contenedor carga este servlet cuando se inicia (instancia y llamada su init () Método; el valor más pequeño del valor positivo, el prioridad más alto, el contenedor, más se inicia, cuanto más se inicia (la instancia y la llamada a su Init (); cuanto más pequeño sea el valor positivo, el contenedor más alto, el contenedor, más se inicia este Servlet, el Método de Servlet, más pequeño; Primero, cuando se inicia-> <arguea-on-startup> 1 </load-on-startup> </servlet> <! El servidor generalmente proporciona una URL predeterminada para el servlet: http: // host/webappPrefix/servletname, sin embargo, este elemento de servicio de servlet puede acceder a los parámetros de inicialización o el proceso de procesar más fácilmente. <Servlet-Mapping> <Servlet-Name> UserService </Servlet-Name> <!-Describe la URL relativa a la raíz de la aplicación web. La sección verde es la interfaz externa del servicio. Encuentre el archivo jax-ws.xml correspondiente (como se muestra a continuación) <Endpoint name = "UserPort" Implementation = "cn.ujn.service.userService" url-Pattern = "/User"> </Endpoint>
Luego está vinculado a la clase de implementación correspondiente correspondiente cn.ujn.service.userservice. El cuerpo del cuerpo del mensaje de solicitud de SOAB enviado por el cliente contiene el nombre del método y la información del parámetro solicitada por el cliente.
El siguiente es el cuerpo del mensaje SOAP encapsulado por el cliente (transmisión de datos con el servidor en modo JSON) (sobre SOAP Rerquest):
<SOAPENV: ENVELOPE XMLNS: SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: q0 = "http://ujn.cn/" xmlns: xsd = "http://wwww.w3.org/2001/xmlschema" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance">- <saapenv: body>- <Q0: login> <arg0> {"username": "shq", "contraseña": "shq"} </arg0> </q0: login> </jabón: body> </</shap. El siguiente es el protocolo SOAP1.1 que invoca el servicio web
/*** Llamando al servicio web a través del protocolo SOAP1.1** Texto/xml Esto se basa en el protocolo SOAP1.1** @param wsdl wsdl ruta* @param Método Método Nombre* @param Espacio de nombres* @param Headerameters Headerameters Headers Parameter* @param Body PAREMETERS* @Param. Un espacio de nombres para el parámetro del cuerpo * @return String * @throws Exception */ public static String InvokeBySoAp11 (string wsdl, string method, string namespace, map <string, string> HeaderParameters, map <string, string> BodyParameters, Boolean ESBODParametersns). // eliminar? Wsdl, obtener la lista de métodos int long = wsdl.length (); wsdl = wsdl.substring (0, longitud - 5); // Crear instancia de URL con cadena como parámetros url url = new url (wsdl); // Crear conexión httpurlconnection conn = (httpurlconnection) url.openconnection (); // establecer el método de solicitud conn.setRequestMethod ("post"); // Si planea usar una conexión URL para la entrada, configure el indicador DoInput en True Conn.setDoInput (verdadero); // Si planea usar una conexión URL para la salida, configure el indicador DoInput en True Conn.setDoOutput (verdadero); // Establezca principalmente el atributo (kv) en el encabezado de solicitud de httpurlconnection conn.setRequestProperty ("Content-type", "text/xml; charset = utf-8"); // Obtenga la secuencia de entrada (relativa al cliente, use outputStream) outputStream out = conn.getOutputStream (); // Obtener el mensaje de la versión SOAP1.1 StringBuilder sb = new StringBuilder (); sb.append ("<SOAP: ENVELOPE XMLNS: xsi =/" http://www.w3.org/2001/xmlschema-instance/ "xmlns: xsd =/" http://www.w3.org/2001/xmlschema/ " xmlns: jabón =/"http://schemas.xmlsoap.org/soap/envelope//" "); sb.append ("xmlns: ns0 =/" " + espacio de nombres +"/""); sb.append (">"); // Ensamble el encabezado del mensaje if (HeaderParameters! = NULL) {sb.append ("<jabón: encabezado>"); for (entrada <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 ("</jabón: encabezado>"); } // ensambla el cuerpo del mensaje sb.append ("<jabón: cuerpo> <ns0:"); sb.append (método); sb.append (">"); // Parámetro de entrada if (BodyParameters! = NULL) {for (Entry <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étodo); sb.append ("> </jabón: cuerpo> </jabón: envolvente>"); // Test System.out.println (sb.ToString ()); // Escribir mensajes SOAP (relativo al cliente, out.write () se usa) out.write (sb.toString (). GetBytes ()); // Obtener el código int correspondiente en el lado del servidor = conn.getResponseCode (); if (código == 200) {inputStream is = conn.getInputStream (); byte [] b = nuevo byte [1024]; int len = 0; SOAPOFRESULT = new StringBuffer (); // Lea un cierto número de bytes del flujo de entrada y guárdelos en la matriz de búfer b. Devuelve el número real de bytes leídos como un número entero // Si no hay bytes disponibles porque el flujo está al final del archivo, el valor es -1; while ((len = is.read (b))! = -1) {// Convierte la matriz de bytes en una cadena usando el charset con nombre. Cadena S = nueva cadena (b, 0, len, "UTF-8"); SOABOFRESULT.Append (s); }} conn.disconnect (); return soapOfResult == nulo? NULL: SOAPOFRESULT.ToString (); } Nota: El cliente está bloqueado después de enviar el mensaje de solicitud SOAP. Hasta que el servidor devuelva el código de estado.
La siguiente es la respuesta del servidor (sobre de respuesta SOAP):
<S: sobre xmlns: s = "http://schemas.xmlsoap.org/soap/envelope/">-<s: body>-<ns2: loginResponse xmlns: ns2 = "http://ujn.cn/"> <return> 1 <//return> </ns2: loginResponse> </s: cuerpo> </s: sobre>
Después de recibir los datos JSON enviados por el servidor, el cliente realizará las operaciones de análisis correspondientes. como sigue:
// analizar el protocolo SOAP (el análisis DOM solo se puede usar para analizar los tipos de documentos XML, mientras que los mensajes SOAP están en formato de datos XML) documento doc = xmlutil.string2doc (resultado); Elemento ele = (elemento) doc.getElementsBytagName ("return"). Item (0); El método String2Doc () utilizado en el método es el siguiente: Public Static Document String2Doc (String Str) {// analiza el documento XML en un DOM Tree DocumentBuilderFactory Factory = DocumentBuilderFactory.newinStance (); Documento documento = nulo; DocumentBuilder Build; if (str == null || str.equals ("")) {return null; } try {inputStream Bais = new ByteArrayInputStream (str.getBytes ("utf-8")); construir = factory.newDocumentBuilder (); // analiza el contenido del InputStream dado como un documento XML y devuelve un nuevo objeto DOM Document. document = build.parse (BAIS); } catch (Exception e) {E.PrintStackTrace (); } documento de retorno; } Según el resultado de la devolución, el cliente realizará el procesamiento correspondiente.
Lo anterior es el principio de trabajo básico de los servicios web.
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!