Позже, чем никогда. :)
Вы должны достичь этого в два этапа:
1) анализировать WSDL, сообщенный пользователем, для получения доступных операций. Обратитесь к этому вопросу , чтобы узнать, как это сделать простым способом.
2) Создать динамический клиент для отправки запроса с использованием выбранных операций. Это можно сделать с помощью Dispatch API от Apache CXF .
Создание объекта Dispatch
для динамического клиента (его можно создать на лету, сообщив конечную точку веб-службы, имя порта и т. Д.):
package com.mycompany.demo;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class Client {
public static void main(String args[]) {
QName serviceName = new QName("http://org.apache.cxf", "stockQuoteReporter");
Service s = Service.create(serviceName);
QName portName = new QName("http://org.apache.cxf", "stockQuoteReporterPort");
Dispatch<DOMSource> dispatch = s.createDispatch(portName,
DOMSource.class,
Service.Mode.PAYLOAD);
...
}
}
Создайте сообщение запроса (в приведенном ниже примере мы используем DOMSource ):
// Creating a DOMSource Object for the request
DocumentBuilder db = DocumentBuilderFactory.newDocumentBuilder();
Document requestDoc = db.newDocument();
Element root = requestDoc.createElementNS("http://org.apache.cxf/stockExample", "getStockPrice");
root.setNodeValue("DOW");
DOMSource request = new DOMSource(requestDoc);
Вызов веб-службы
// Dispatch disp created previously
DOMSource response = dispatch.invoke(request);
Рекомендации:
- Используйте
((BindingProvider)dispatch).getRequestContext().put("thread.local.request.context", "true");
, если хотите сделать поток объекта Dispatch безопасным.
- Кэшируйте объект
Dispatch
для последующего использования, если это так. Процесс строительства объекта не бесплатен.
Другие методы
Существуют и другие методы создания динамических клиентов, например, использование CXF dynamic-clients API. Вы можете прочитать на главной странице проекта:
CXF поддерживает несколько альтернатив, позволяющих приложению
общаться с сервисом без SEI и классов данных
Я сам не пробовал, но стоит попробовать.