如何使用 java 发送带有用户名和密码的 SOAP 请求,就像在 SOAP UI 中一样

How to send SOAP request with username and password like in SOAP UI using java

抱歉,如果这个问题重复,但我在 Whosebug 中尝试了几个解决方案,但仍然无法发送 SOAP 请求。

我目前的情况是我的 java 应用程序需要向我的客户 Web 服务发送 SOAP 请求,我在 SOAP UI 中成功地做到了这一点,用户名、密码、身份验证类型:抢先。请看图

现在我想在 Java 中执行此操作,我已经创建了 SOAP 信封,没有设置密码,响应与在没有身份验证的 SOAP UI 中完全相同,它意味着 java 代码只需要添加身份验证即可工作。 这是我当前的 Java 代码:

callSoapWebService(soapEndpointUrl, soapAction);

private static void callSoapWebService(String soapEndpointUrl, String soapAction) {
    try {
        // Create SOAP Connection
        SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
        SOAPConnection soapConnection = soapConnectionFactory.createConnection();

        // Send SOAP Message to SOAP Server
        SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(soapAction), soapEndpointUrl);

        // Print the SOAP Response
        System.out.println("Response SOAP Message:");
        soapResponse.writeTo(System.out);
        System.out.println();

        soapConnection.close();
    } catch (Exception e) {
        System.err.println("\nError occurred while sending SOAP Request to Server!\nMake sure you have the correct endpoint URL and SOAPAction!\n");
        e.printStackTrace();
    }
}

private static SOAPMessage createSOAPRequest(String soapAction) throws Exception {
    MessageFactory messageFactory = MessageFactory.newInstance();
    SOAPMessage soapMessage = messageFactory.createMessage();

    createSoapEnvelope(soapMessage);

    MimeHeaders headers = soapMessage.getMimeHeaders();
    headers.addHeader("SOAPAction", soapAction);

    soapMessage.saveChanges();

    return soapMessage;
}

createSoapEnvelope() 内部是创建 SOAP 请求的代码 body,所以我想我必须对 header 做一些事情。任何人都可以像我在 SOAP UI?

中那样帮助我实现身份验证

您需要以基本格式发送用户名和密码:

String userAndPassword = String.format("%s:%s",username, password);

String basicAuth = new sun.misc.BASE64Encoder().encode(userAndPassword.getBytes());
MimeHeaders mimeHeaders = message.getMimeHeaders();
mimeHeaders.addHeader("Authorization", "Basic " + basicAuth);

如果您使用 Java 8,请使用 Base64.getEncoder().encodeToString() 而不是 new sun.misc.BASE64Encoder()