Java 호출 웹 서비스

Shubham Vora 2023년10월12일
  1. SOAP 웹 서비스
  2. Java 클래스에서 SOAP 웹 서비스 호출
Java 호출 웹 서비스

이 기사에서는 Java 클래스에서 SOAP 웹 서비스 호출을 수행하는 방법을 설명합니다.

SOAP 웹 서비스

SOAPSimple Object Access Protocol을 의미합니다. 웹 서비스는 이 XML 기반 인터페이스를 통해 액세스할 수 있습니다.

W3C는 두 앱 간의 통신을 위해 SOAP를 권장합니다. SOAP 프로토콜은 XML 기반입니다.

특정 플랫폼이나 언어에 대한 선호도가 없습니다. SOAP를 활용하여 다른 프로그래밍 언어 앱과 통신할 수 있습니다.

Java 클래스에서 SOAP 웹 서비스 호출

경우에 따라 웹 서비스 라이브러리보다 Java 클래스를 활용하여 SOAP 서비스를 호출하는 것이 더 빠르고 도움이 될 수 있습니다. 예를 들어 웹 서비스 라이브러리를 사용하여 클라이언트 프록시를 생성하거나 응답의 일부 작고 특수한 부분을 원하는 경우 문제가 발생할 수 있습니다.

Java 라이브러리를 사용하지 않고 간단한 Java 코드 조각에서 HTTP 또는 HTTPS 프로토콜을 통한 SOAP 요청입니다.

다음은 Java 클래스에서 SOAP 웹 서비스를 호출하는 단계입니다.

WSDL

먼저 WSDL 파일을 열어 Java 클래스에서 SOAP 웹 서비스 호출을 만듭니다. WSDL 파일에서 XSD, SOAP 작업SOAP 주소 위치를 확인하십시오.

SOAP 요청 및 응답의 이름은 각각 getUserDetailsRequestgetUserDetailsResponse입니다. 또한 요청의 입력 매개변수가 있습니다.

여기에는 이름이라는 하나의 인수만 존재하며 이는 문자열입니다.

...
<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>
...

XML 요청

응답 XML 구조를 생성하는 데 Java 코드가 필요하지 않습니다. 서버에서 가져오기 때문입니다. 그러나 SOAP 서비스에 대한 입력으로 제출해야 하므로 요청 XML 구조를 생성하려면 Java 코드가 필요합니다.

<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>

‘SOAP’ 주소

SOAP 서비스의 엔드포인트 URL 역할을 하는 SOAP 주소 위치를 찾으십시오. Java의 HttpURLConnection API를 사용하여 이 엔드포인트에 연결합니다.

‘SOAP’ 동작

그런 다음 SOAP 작업으로 활용될 작업 이름을 찾아야 합니다. getUserDetails는 여기에 있습니다.

SOAP 클라이언트 생성

우리는 모든 필수 사항을 결정했으며 사용자 지정 Java 클래스를 개발할 준비가 되었습니다.

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);
    }
  }
}

HTTPS 호출

아래 코드 샘플의 아이디어를 사용하여 HTTPS 연결을 통해 SOAP 웹 서비스를 호출합니다. 이 예는 GETPOST 메소드를 사용하여 일반 Java 코드에서 SOAP 웹 서비스에 연결하는 방법을 보여줍니다.

아래 코드는 HTTPS 프로토콜을 사용하는 방법을 보여줍니다. 따라서 응용 프로그램의 코드를 개발하는 동안 모든 프로그래밍 표준을 고려하십시오.

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();
  }
}

이 기사에서는 Java 클래스에서 SOAP 웹 서비스 호출을 수행하는 방법을 설명했습니다. 이 문서에서는 다양한 단계에 대해 설명합니다.

사용자는 단계에 따라 Java 클래스에서 SOAP 웹 서비스 호출을 호출할 수 있습니다.

작가: Shubham Vora
Shubham Vora avatar Shubham Vora avatar

Shubham is a software developer interested in learning and writing about various technologies. He loves to help people by sharing vast knowledge about modern technologies via different platforms such as the DelftStack.com website.

LinkedIn GitHub