Как получить доступ к конечной точке URL-адреса веб-службы SOAP из Java - PullRequest
0 голосов
/ 04 мая 2018

Как получить доступ к конечной точке URL-адреса веб-службы SOAP из Java?

Я какое-то время искал конкретный пример и ничего не понимаю. К сожалению, мой предпочтительный метод с использованием REST недоступен в этом сценарии, над которым я работаю, поэтому необходимо протестировать подход, основанный на SOAP.

Настройка, например, есть файл SOAP WSDL, расположенный в www.website.com/soap.wsdl. И я пытаюсь отправлять и получать данные от конечной точки CreateData.

Когда я добавляю файл WSDL в программное обеспечение SoapUI для тестирования, генерируется следующий шаблон сообщения SOAP:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tic="{redacted}">
   <soapenv:Header/>
   <soapenv:Body>
      <tic:CreateData>
         <tic:request>{"testKey":"testValue"}</tic:request>
      </tic:CreateData>
   </soapenv:Body>
</soapenv:Envelope>

(я добавил данные теста JSON)

Похоже, я не могу понять, как превратить этот запрос, который правильно работает в SoapUI, в работающий фрагмент тестового кода Java.

Когда я импортирую WSDL в мою IDE, он генерирует один файл Java, который выглядит следующим образом;

import javax.jws.WebService;

@WebService(serviceName = "{redacted}", portName = "{redacted}", endpointInterface = "{redacted}", targetNamespace = "{redacted}", wsdlLocation = "WEB-INF/wsdl/null/null.wsdl")
public class NewWebServiceFromWSDL {

    public java.lang.String createData(java.lang.String request) {
        //TODO implement this method
        throw new UnsupportedOperationException("Not implemented yet.");
    }

}

Естественно, теперь я понятия не имею, что делать дальше. Как мне создать конверт SOAP в Java? Я ожидал бы увидеть некоторые методы, сгенерированные для таких вещей, как setSOAPEnvelopeHeader (), setSOAPEnvelopeBody (), setSOAPEnvelopeVariableRequest () и т. Д. (Или аналогичные).

Затем, как только объект SOAP Envelope был создан (как бы это ни было сделано), как мне тогда фактически отправлять сообщение и обрабатывать ответ?

Чувство смущения ...

1 Ответ

0 голосов
/ 04 мая 2018

Это жестокий способ вызова SOAP, но он работает, и будет неплохо начать. Затем вы вносите некоторые изменения для работы с SOAPEnvelope / SOAPBody, и это все.

package xml;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.xml.soap.MessageFactory;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;

import com.sun.xml.internal.ws.encoding.soap.SOAP12Constants;


public class SOAPCall {

public static void main(String[] args) throws UnsupportedOperationException, SOAPException, IOException {

    String endPoint = "URL";

    SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
    SOAPConnection soapConnection = soapConnectionFactory.createConnection();

    String soapString = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tic=\"{redacted}\">"
            + "<soapenv:Header/><soapenv:Body>"
            + "<tic:CreateData><tic:request>{\"testKey\":\"testValue\"}</tic:request>"
            + "</tic:CreateData></soapenv:Body></soapenv:Envelope>";

    InputStream is = new ByteArrayInputStream(soapString.getBytes());

    SOAPMessage request = MessageFactory.newInstance().createMessage(null, is);

    MimeHeaders headers = request.getMimeHeaders();
    // If SOAP Header is compulsory
    // headers.addHeader("SOAPAction",
    // "http://www.tdcare.com/DataInterchange");
    headers.setHeader("Content-Type", "application/xml");
    request.saveChanges();

    SOAPMessage soapResponse = soapConnection.call(request, endPoint);

    System.out.println(soapResponse);
}
}
...