Что такое хорошая библиотека Java для динамических операций клиента SOAP? - PullRequest
6 голосов
/ 27 июля 2011

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

Кто-нибудь знает хорошую клиентскую библиотеку SOAP, которая позволитиспользование во время выполнения?Или я могу использовать функциональность axis2 wsdl2java для создания заглушек в загрузчике классов и использовать их во время выполнения?

1 Ответ

3 голосов
/ 07 марта 2014

Позже, чем никогда. :)

Вы должны достичь этого в два этапа:

  • 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 и классов данных

Я сам не пробовал, но стоит попробовать.

...