Java Call Web サービス
この記事では、Java クラスから SOAP
Web サービス呼び出しを行う方法を説明します。
SOAP
Web サービス
SOAP
は Simple 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
ファイル内の XSD
、SOAP 操作
、および SOAP アドレス
の場所を確認します。
SOAP
リクエストとレスポンスには、それぞれ getUserDetailsRequest
と getUserDetailsResponse
という名前が付いています。 さらに、リクエストの入力パラメータがあります。
ここに存在する引数は、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 サービス呼び出しを呼び出すことができます。