如何像 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