Java Call Web サービス

Shubham Vora 2023年10月12日
  1. SOAPWeb サービス
  2. Java クラスからの SOAP Web サービス呼び出し
Java Call Web サービス

この記事では、Java クラスから SOAP Web サービス呼び出しを行う方法を説明します。

SOAPWeb サービス

SOAPSimple Object Access Protocol の略です。 Web サービスは、この XML ベースのインターフェースを介してアクセスできます。

W3C は、2つのアプリ間の通信に SOAP を推奨しています。 SOAP プロトコルは XML ベースです。

特定のプラットフォームや言語を優先することはありません。 SOAP を利用して、他のプログラミング言語アプリと通信することができます。

Java クラスからの SOAP Web サービス呼び出し

状況によっては、SOAP サービスを呼び出すために、Web サービス ライブラリよりも Java クラスを利用する方が迅速で役立つ場合があります。 たとえば、Web サービス ライブラリを使用してクライアント プロキシを生成する場合や、応答の小さな特殊な部分が必要な場合に問題が発生する可能性があります。

これは、Java ライブラリを使用せずに、Java コードの単純な部分からの HTTP または HTTPS プロトコルを介した単純な SOAP リクエストです。

これらは、Java クラスから SOAP Web サービス を呼び出すための次の手順です。

WSDL

まず、WSDL ファイルを開き、Java クラスから SOAP Web サービス呼び出しを行います。 WSDL ファイル内の XSDSOAP 操作、および SOAP アドレス の場所を確認します。

SOAP リクエストとレスポンスには、それぞれ getUserDetailsRequestgetUserDetailsResponse という名前が付いています。 さらに、リクエストの入力パラメータがあります。

ここに存在する引数は、name だけであり、string です。

...
<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 Web サービスを呼び出すには、以下のコード サンプルのアイデアを使用します。 この例は、GET および POST メソッドを使用して、通常の Java コードから SOAP Web サービスに接続する方法を示しています。

以下のコードは、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 Web サービス呼び出しを行う方法を説明しました。 この記事では、さまざまな手順について説明します。

ユーザーは、手順に従って、Java クラスから SOAP Web サービス呼び出しを呼び出すことができます。

著者: 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