Почтальон, возвращающий нулевые значения в ответе SOAP - PullRequest
0 голосов
/ 19 февраля 2020

Я новичок в SOAP и POSTMAN и мне интересно, что я делаю неправильно со следующим. У меня есть пример java веб-сервиса с использованием jax-ws:

@WebService(endpointInterface = "Soap1.SOAPInterface")
public class SOAPService implements SOAPInterface
{
public String message(String name)
{
    return "Hello " + name;
}
}

Я опубликовал этот веб-сервис с использованием конечной точки:

public class Publisher 
{
public static void main(String[]args)
{
    Endpoint.publish("http://localhost:9006/Service", new SOAPService());
}
}

Теперь, когда я запускаю это на клиенте, он работает нормально

    public static void main(String[] args) throws Exception
    {
    URL url = new URL("http://localhost:9006/Service?wsdl");
    QName qname = new QName("http://Soap1/","SOAPServiceService");
    Service s = Service.create(url,qname);
    SOAPInterface i = s.getPort(SOAPInterface.class);
    System.out.println(i.message("Bob"));
    }

Однако при попытке использовать POSTMAN для анализа SOAP запроса / ответов. Введя для запроса xml:

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        <MyMessage xmlns="http://Soap1/">
            <name>Bob</name>
        </MyMessage>
    </Body>
</Envelope>

Я получаю ответ Hello null

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:MyMessageResponse xmlns:ns2="http://Soap1/">
            <returnedMessage>Hello null</returnedMessage>
        </ns2:MyMessageResponse>
    </S:Body>
</S:Envelope>

Мне интересно, почему это происходит, потому что при использовании клиента параметры проходят нормально, но при использовании POSTMAN они, кажется, не передаются.

Снимок экрана почтальон: POSTMAN

1 Ответ

0 голосов
/ 20 февраля 2020

Если вы откроете в браузере URI http://localhost: 9006 / Service? Wsdl , вы увидите WSDL, сгенерированный JAX-WS для вашей службы. Он должен содержать следующий фрагмент:

<types>
<xsd:schema>
<xsd:import namespace="http://example.soap.kdv.org/" schemaLocation="http://localhost:9006/Service?xsd=1"/>
</xsd:schema>
</types>

Содержит ссылку на XML схему, определяющую структуру XML сообщений, используемых в веб-сервисе. Если вы откроете URI http://localhost: 9006 / Service? Xsd = 1 (URI может отличаться, проверьте его), вы увидите определение запроса и ответного сообщения:

<xs:schema xmlns:tns="http://example.soap.kdv.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://example.soap.kdv.org/">
<xs:element name="message" type="tns:message"/>
<xs:element name="messageResponse" type="tns:messageResponse"/>
<xs:complexType name="message">
<xs:sequence>
<xs:element name="arg0" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="messageResponse">
<xs:sequence>
<xs:element name="return" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

Определяет следующую структуру сообщения запроса:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:exam="http://example.soap.kdv.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <exam:message>
         <!--Optional:-->
         <arg0>test</arg0>
      </exam:message>
   </soapenv:Body>
</soapenv:Envelope>

Попробуйте это сообщение в почтальоне, оно должно вернуть желаемый результат.

Также я бы порекомендовал SOAP UI инструмент для тестирования веб-сервисов. При создании нового проекта SOAP в этом инструменте он импортирует WSDL и генерирует для вас сообщения запроса.

...