Подтвердить что ты не робот

Ява. Проверка сообщения SOAP против WSDL

Мне нужно проверить сообщение SOAP на WSDL? (так же, как файл XML может быть проверен с помощью схемы XSD).

Я не звоню в какой-либо веб-сервис; У меня просто есть сообщение SOAP и WSDL, и мне нужно проверить правильность сообщения SOAP. без вызова веб-службы или после этого.

Мне нужно сделать эту проверку в рамках программы Java. Знаете ли вы о небольшой библиотеке Java для этого?

ps: Я знаю, что несколько библиотек JAX-WS могут проверять запрос/ответ при вызове webservice. Но опять же, я не звоню в какой-либо веб-сервис; У меня есть простое сообщение SOAP и WSDL, и мне нужна функция, которая проверяет сообщение SOAP на WSDL.

ps: Я также знаю, что есть инструменты, которые могут это сделать, например SOAPUI и XMLSpy. Опять же, мне нужно выполнить эту проверку в моей программе Java.

ps: Я знаю, что я мог извлечь часть тела сообщения SOAP и проверить его на XSD. Тем не менее, я бы хотел проверить все сообщение SOAP на WSDL.

4b9b3361

Ответ 2

Если вы создаете клиент webservice с использованием генератора кода на основе Apache CXF или Apache Axis 2, вероятность того, что ваш код веб-службы будет работать нормально, пока не будет работать как поставщик веб-службы, так и ваш клиент в той же версии SOAP/WS *. Основываясь на API, который вы выбираете для вызова веб-сервиса, вы можете узнать, может ли возможность ведения журнала этого API использоваться для распечатки созданного запроса SOAP.

Другим подходом может быть использование такого инструмента, как SOAPUI. Вы можете попытаться настроить mock webservice с использованием SOAP UI на основе WSDL, который у вас есть, а затем вызывать тестирование вашего клиента webservice, вызывая макет службы. См. Ссылку на SOAP UI здесь http://www.soapui.org/Getting-Started/web-service-sample-project/1-Web-Service-Mocking.html

Ответ 3

Я думаю, что вы можете искать ответ, слишком сложный для того, что вам действительно нужно. Все, что вам действительно нужно сделать, - это зарегистрировать соответствующие документы DTD/XSD, чтобы нормальные классы JAXP могли ссылаться на них.

Этот код, из Sun/Oracle, реализует базовый EntityResolver. Вы должны построить этот класс таким образом, чтобы он предоставил DocumentBuilder соответствующий InputSource для схемы, определенной в документах, которые вы пытаетесь проверить.

import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;

public class MyResolver implements EntityResolver {
    public InputSource resolveEntity (String publicId, String systemId) {
        if (systemId.equals("http://www.myhost.com/today")) {
            // return a special input source
            MyReader reader = new MyReader();
            return new InputSource(reader);
        } else {
            // use the default behaviour
            return null;
        }
    }
}

Используя этот код, вы можете использовать свой собственный EntityResolver и использовать его во время разбора/проверки документа.

final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware = true;
dbf.setValidating = true;
final DocumentBuilder db = dbf.newDocumentBuilder();
final MyResolver r = MyResolver.newInstance();
db.setEntityResolver(r);
final Document docFromFile = db.parse("path/to/my/document.xml");
// or
final Document docFromStream = db.parse(new FileInputStream("blah"));

Ответ 4

Вы можете создать заглушку, используя WSDL, который у вас есть, и затем сделать запрос на заглушку, используя ваш XML-запрос. Если это правильно, ваш запрос правильный.

Вы можете импортировать WSDL в свой проект, а затем сделать звонок к службе-заглушке, используя ваш XML. Таким образом, вы можете вносить изменения в проверки без каких-либо изменений в коде.

Ответ 5

Попробуйте это

  • Используйте WSDL и создайте прокси-сервер Jax-RPC
  • Создайте обработчик JSX-обработчика webservice и зарегистрируйте его в ссылке webservice. Пожалуйста, обратитесь эту ссылку, чтобы увидеть, как создавать обработчики веб-сервисов.
  • В обработчике попробуйте приведенный ниже код в public boolean handleRequest(MessageContext mc) добавить эти строки

    mc.setProperty("USE_TEST_FILE", <your response in .xml file>);
    return false;
    
  • В public boolean handleResponse(MessageContext mc)

    String testFileName = (String) mc.getProperty("USE_TEST_FILE");
    InputStream instream = <read file as an input stream>
    SOAPMessageContext smc = (SOAPMessageContext) mc;
    SOAPMessage message = smc.getMessage();
    SOAPPart soapPart = message.getSOAPPart();
    soapPart.setContent(new StreamSource(instream));
    smc.setMessage(message);
    return false;
    

теперь запустите прокси-сервер.. прокси-сервер потерпит неудачу, если сообщение недействительно для WSDL

Ответ 6

Поскольку сообщение SOAP равно xml, вы можете проверить целостное сообщение против xsd. Например, я нашел эту схему для сообщения SOAP. Вы могли:

  • Извлеките схему из вашего wsdl,
  • Подтвердить сообщение против схемы из схемы wsdl и soap.

Если вы хотите выполнить проверку против определенного WSDL, вы можете подготовить свою схему вручную: просто разместите корневой элемент своего сообщения вместо этой части:

<xs:sequence>
<xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>

в схеме SOAP.

Ответ 7

Подтвердите против схему конверта SOAP, затем извлеките тело и заголовки и проверьте на соответствие конкретной схеме. Должно быть достаточно простым.