如何像 SoapUI 一样向端点或 WSDL 发出 SOAP 请求?
How to make a SOAP Request to an Endpoint or WSDL like SoapUI?
我需要向 WSDL 描述的 BPEL 流程发出请求。我一直在使用 SoapUI 通过提供 WSDL URL 来测试它,一切正常。
现在我需要在 Java 中做同样的事情。我正在构建一个 Web 服务,它从另一个 Web 服务接收数据,并且需要将它传递给 BPEL 流程。我尝试使用 wsdl2java 和 wsimport 生成存根,但这不起作用,因为我的 BPEL WSDL 没有服务定义(我无法添加它,因为如果我这样做,WSDL 在我的 BPEL 中不起作用).
因此,由于 SoapUI 能够发出请求,很明显,有一些方法可以在没有服务定义的情况下调用 BPEL WSDL,我认为这是解决我的问题的唯一方法。
TL/DR: SoapUI 如何向 wsdl 文件发出请求,我该如何做?
查看 Java Web 服务框架,例如 JAX-WS、Metro、CXF、Axis2、SpringWS 等的参考实现,它们都能够获取您的 WSDL 并提供或生成客户存根给你。
我设法通过创建一个新的 WSDL 来解决这个问题,该 WSDL 将创建与来自 BPEL WSDL 的存根兼容的存根,并通过创建一个客户端 class 来发送 SOAP 消息,如 in here 所述。为了找出我需要在消息中定义的内容,我使用了 SoapUI 记录器来查看消息发送的内容。
我什至直接从 oracle 成功地使用了这段代码。如果需要,您需要安装一个证书,并根据需要添加更多 headers。
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;
public class TestWSHTTPS {
private static final int TIME_OUT = 10000;
public static void main(String[] args) throws Exception {
final String URL = "http://localhost:8080/TestSoap";
final String FILE = "/path/to/your/file.txt";
URL obj = new URL(URL);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setConnectTimeout(TIME_OUT);
byte[] fileBytes = Files.readAllBytes(Paths.get(FILE));
String fileContent = new String(fileBytes, "UTF-8");
// request headers (add all headers needed)
con.setRequestMethod("POST");
con.setRequestProperty("Content-length", String.valueOf(fileBytes.length));
con.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");
// Send post request
con.setDoOutput(true);
con.setReadTimeout(TIME_OUT);
DataOutputStream outputStream= new DataOutputStream(con.getOutputStream());
outputStream.write(fileContent.getBytes());
int responseCode = con.getResponseCode();
System.out.println("responseCode:" + responseCode);
InputStream in = null;
if (con.getResponseCode() >= 200 && con.getResponseCode()<= 300 ) {
in = con.getInputStream();
} else {
in = con.getErrorStream();
}
System.out.println("\nSending 'POST' request to URL : " + URL);
System.out.println("Response Code : " + responseCode);
Scanner s = new Scanner(in).useDelimiter("\A");
String result = s.hasNext() ? s.next() : "";
System.out.println(result);
}
}
查看完整示例 here。
我需要向 WSDL 描述的 BPEL 流程发出请求。我一直在使用 SoapUI 通过提供 WSDL URL 来测试它,一切正常。
现在我需要在 Java 中做同样的事情。我正在构建一个 Web 服务,它从另一个 Web 服务接收数据,并且需要将它传递给 BPEL 流程。我尝试使用 wsdl2java 和 wsimport 生成存根,但这不起作用,因为我的 BPEL WSDL 没有服务定义(我无法添加它,因为如果我这样做,WSDL 在我的 BPEL 中不起作用).
因此,由于 SoapUI 能够发出请求,很明显,有一些方法可以在没有服务定义的情况下调用 BPEL WSDL,我认为这是解决我的问题的唯一方法。
TL/DR: SoapUI 如何向 wsdl 文件发出请求,我该如何做?
查看 Java Web 服务框架,例如 JAX-WS、Metro、CXF、Axis2、SpringWS 等的参考实现,它们都能够获取您的 WSDL 并提供或生成客户存根给你。
我设法通过创建一个新的 WSDL 来解决这个问题,该 WSDL 将创建与来自 BPEL WSDL 的存根兼容的存根,并通过创建一个客户端 class 来发送 SOAP 消息,如 in here 所述。为了找出我需要在消息中定义的内容,我使用了 SoapUI 记录器来查看消息发送的内容。
我什至直接从 oracle 成功地使用了这段代码。如果需要,您需要安装一个证书,并根据需要添加更多 headers。
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;
public class TestWSHTTPS {
private static final int TIME_OUT = 10000;
public static void main(String[] args) throws Exception {
final String URL = "http://localhost:8080/TestSoap";
final String FILE = "/path/to/your/file.txt";
URL obj = new URL(URL);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setConnectTimeout(TIME_OUT);
byte[] fileBytes = Files.readAllBytes(Paths.get(FILE));
String fileContent = new String(fileBytes, "UTF-8");
// request headers (add all headers needed)
con.setRequestMethod("POST");
con.setRequestProperty("Content-length", String.valueOf(fileBytes.length));
con.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");
// Send post request
con.setDoOutput(true);
con.setReadTimeout(TIME_OUT);
DataOutputStream outputStream= new DataOutputStream(con.getOutputStream());
outputStream.write(fileContent.getBytes());
int responseCode = con.getResponseCode();
System.out.println("responseCode:" + responseCode);
InputStream in = null;
if (con.getResponseCode() >= 200 && con.getResponseCode()<= 300 ) {
in = con.getInputStream();
} else {
in = con.getErrorStream();
}
System.out.println("\nSending 'POST' request to URL : " + URL);
System.out.println("Response Code : " + responseCode);
Scanner s = new Scanner(in).useDelimiter("\A");
String result = s.hasNext() ? s.next() : "";
System.out.println(result);
}
}
查看完整示例 here。