Servicios web de llamadas de Java
Este artículo nos enseñará cómo hacer una llamada de servicio web SOAP
desde una clase de Java.
Servicios web SOAP
El SOAP
significa Protocolo simple de acceso a objetos
. Se puede acceder a los servicios web a través de esta interfaz basada en XML
.
El W3C
recomienda SOAP
para la comunicación entre dos aplicaciones. El protocolo SOAP
está basado en XML.
No tiene preferencia por ninguna plataforma o idioma en particular. Puede comunicarse con otras aplicaciones de lenguaje de programación utilizando SOAP
.
Llamada de servicio web SOAP
desde una clase Java
En algunas situaciones, puede ser más rápido y más útil utilizar clases de Java en lugar de la biblioteca de servicios web
para invocar el servicio SOAP
. Por ejemplo, puede tener problemas al usar una biblioteca de servicio web
para generar un proxy de cliente o si desea algunas porciones pequeñas y especializadas de la respuesta.
Es simplemente una solicitud SOAP
a través del protocolo HTTP
o HTTPS
desde una simple pieza de código Java sin utilizar ninguna biblioteca Java.
Estos son los siguientes pasos para llamar al Servicio Web SOAP
desde una clase Java.
el WSDL
Primero, abra el archivo WSDL
para realizar una llamada de servicio web SOAP
desde una clase Java. Compruebe las ubicaciones XSD
, Operación SOAP
y Dirección SOAP
en el archivo WSDL
.
Las solicitudes y respuestas SOAP
tienen los nombres getUserDetailsRequest
y getUserDetailsResponse
, respectivamente. Además, están los parámetros de entrada de la solicitud.
Aquí solo está presente un argumento, nombre
, y es una cadena
.
...
<xs:element name="getUserDetailsRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getUserDetailsResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="users" type="tns:user" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
...
Solicitud XML
No se requiere código Java para crear la estructura XML
de respuesta, ya que la obtendremos del servidor. Sin embargo, se requiere código Java para crear la estructura XML
de la solicitud porque debemos enviarla como entrada al servicio SOAP
.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<getUserDetailsRequest xmlns="https://roytuts.com/UserService">
<name>User Name</name>
</getUserDetailsRequest>
</soapenv:Body>
</soapenv:Envelope>
Dirección SOAP
Encuentre la ubicación de la dirección SOAP
, que sirve como URL de punto final del servicio SOAP
. Nos conectaremos a este punto final usando la API HttpURLConnection
de Java.
Operación SOAP
Luego se debe ubicar el nombre de la operación, que se utilizará como acción SOAP
. getUserDetails
se encuentra aquí.
Crear cliente SOAP
Hemos determinado todas las necesidades y estamos preparados para desarrollar la clase Java personalizada.
package com.roytuts.soap.client;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class SoapClient {
public static void main(String[] args) throws IOException {
// Webservice HTTP request configurations
String wsEndPoint = "http://localhost:9999/ws";
URL url = new URL(wsEndPoint);
URLConnection connection = url.openConnection();
HttpURLConnection http = (HttpURLConnection) connection;
ByteArrayOutputStream bout = new ByteArrayOutputStream();
String xmlInput = "<soapenv:Envelope xmlns:soapenv=" http
: // schemas.xmlsoap.org/soap/envelope/"><soapenv:Header/><soapenv:Body><getUserDetailsRequest
// xmlns="https://roytuts.com/UserService"><name>User
// Name</name></getUserDetailsRequest></soapenv:Body></soapenv:Envelope>";
byte[] buffer = new byte[xmlInput.length()];
buffer = xmlInput.getBytes();
bout.write(buffer);
byte[] b = bout.toByteArray();
String stringResponse = "";
String stringOutput = "";
String SOAPAction = "getUserDetails";
http.setRequestProperty("Content-Length", String.valueOf(b.length));
http.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
http.setRequestProperty("SOAPAction", SOAPAction);
http.setRequestMethod("POST");
http.setDoOutput(true);
http.setDoInput(true);
OutputStream out = http.getOutputStream();
out.write(b);
out.close();
InputStreamReader isr = new InputStreamReader(http.getInputStream(), Charset.forName("UTF-8"));
BufferedReader in = new BufferedReader(isr);
while ((stringResponse = in.readLine()) != null) {
stringOutput = stringOutput + stringResponse;
}
String formattedSOAPResponse = formatXML(stringOutput);
System.out.println(formattedSOAPResponse);
}
private static String formatXML(String unformattedXml) {
try {
Document document = parseXmlFile(unformattedXml);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
transformerFactory.setAttribute("indent-number", 3);
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(document);
StreamResult xmlOutput = new StreamResult(new StringWriter());
transformer.transform(source, xmlOutput);
return xmlOutput.getWriter().toString();
} catch (TransformerException e) {
throw new RuntimeException(e);
}
}
private static Document parseXmlFile(String in) {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(in));
return db.parse(is);
} catch (IOException | ParserConfigurationException | SAXException e) {
throw new RuntimeException(e);
}
}
}
Llamada HTTPS
Utilice la idea del ejemplo de código siguiente para llamar a un servicio web SOAP
a través de una conexión HTTPS
. Este ejemplo demuestra cómo contactar un servicio web SOAP
desde un código Java común utilizando los métodos GET
y POST
.
El siguiente código sirve como ilustración de cómo usar el protocolo HTTPS
. Por lo tanto, intente considerar todos los estándares de programación mientras desarrolla el código para su aplicación.
package com.roytuts.java.soap.https.connection;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
public class JavaSoapHttpsClient {
public static void main(String[] args) throws Exception {
invokeSoapService(
"https://postman-echo.com/post", "POST", "<xml><body>SAOP request</body></xml>");
invokeSoapService("https://www.google.com", "GET", null);
}
public static void invokeSoapService(
final String url, final String httpMethod, final String requestXML) throws IOException {
URL myUrl = new URL(url);
HttpURLConnection http = (HttpsURLConnection) myUrl.openConnection();
http.setDoOutput(true);
http.setRequestMethod(httpMethod);
OutputStreamWriter out = null;
if ("POST".equals(httpMethod) && requestXML != null) {
out = new OutputStreamWriter(conn.getOutputStream());
out.append(requestXML);
}
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
System.out.println("Response Code: " + conn.getResponseCode());
System.out.print("Response Text: ");
while ((inputLine = br.readLine()) != null) {
System.out.println(inputLine);
}
if (out != null) {
out.flush();
out.close();
}
br.close();
}
}
Este artículo nos enseñó cómo hacer una llamada de servicio web SOAP
desde una clase de Java. Varios pasos se discuten en este artículo.
Los usuarios pueden seguir los pasos para realizar una llamada de servicio web SOAP
desde la clase Java.