Вызов веб-службы с использованием Javascript с конвертом SOAP завершается неудачно - PullRequest
1 голос
/ 02 ноября 2011

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

Использование конверта SOAP является обязательным требованием, мне нужно знать, что, возможно, не так с этим кодом, а не то, как я мог бы сделать то же самое, используя другие методы. (Служба правильно развернута на сервере GlassFish, и у меня есть работающий Java-клиент для его тестирования, поэтому проблем со службой нет)

Кто-нибудь видит что-то плохое (я тоже присоединяюсь к WSDL, если вам нужны другие подробности, не стесняйтесь)? Спасибо!

<html>
<head>
    <title>Soap Invocation</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <script type="text/javascript">

        var request = null;

        function createRequest() {
            if (window.XMLHttpRequest){
                request=new XMLHttpRequest();
            }
            else{
                if (new ActiveXObject("Microsoft.XMLHTTP")) {
                    request = new ActiveXObject("Microsoft.XMLHTTP");
                } else {
                    request = new ActiveXObject("Msxml2.XMLHTTP");
                }
            } 
        }

        function getMail() {
            createRequest();
            var envelope = "<?xml version='1.0' encoding='UTF-8'?>";
            envelope += "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>";
            envelope += "<soap:Header/>";
            envelope += "<soap:Body>";
            envelope += "<ns2:getMails xmlns:ns2='http://service.inf4375.com/'>";
            envelope += "</ns2:getMails>";
            envelope += "</soap:Body>";
            envelope += "</soap:Envelope>";

            var url = "http://127.0.0.1:8080/SoapService/MailingService";

            request.onreadystatechange = updatePage;

            request.open("GET", url, false);
            request.setRequestHeader("Content-Type", "text/html");
            request.setRequestHeader("SOAPAction", "");
            request.send(envelope);
        }

        function updatePage() {

            if(request.readyState == 4) {
                document.getElementById("get").innerHTML = "<p>" + request.responseXML.selectSingleNode("//return").text + "</p>";
            } else {
                document.getElementById("get").innerHTML = "Loading..."
            }

        }
    </script>
</head>
<body>
    <input type="button" value="GetMail" onclick="getMail();" />
    <span id="get"></span>       
</body>
</html>

WSDL:

<?xml version='1.0' encoding='UTF-8'?>
<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.inf4375.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://service.inf4375.com/" name="MailingService">
<types>
    <xsd:schema>
        <xsd:import namespace="http://service.inf4375.com/" schemaLocation="http://localhost:8080/SoapService/MailingService?xsd=1"/>
    </xsd:schema>
</types>
<message name="getMails">
    <part name="parameters" element="tns:getMails"/>
</message>
<message name="getMailsResponse">
    <part name="parameters" element="tns:getMailsResponse"/>
</message>
<message name="addMail">
    <part name="parameters" element="tns:addMail"/>
</message>
<message name="addMailResponse">
    <part name="parameters" element="tns:addMailResponse"/>
</message>
<portType name="Mailing">
    <operation name="getMails">
        <input wsam:Action="http://service.inf4375.com/Mailing/getMailsRequest" message="tns:getMails"/>
        <output wsam:Action="http://service.inf4375.com/Mailing/getMailsResponse" message="tns:getMailsResponse"/>
    </operation>
    <operation name="addMail">
        <input wsam:Action="http://service.inf4375.com/Mailing/addMailRequest" message="tns:addMail"/>
        <output wsam:Action="http://service.inf4375.com/Mailing/addMailResponse" message="tns:addMailResponse"/>
    </operation>
</portType>
<binding name="MailingPortBinding" type="tns:Mailing">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="getMails">
        <soap:operation soapAction=""/>
        <input>
            <soap:body use="literal"/>
        </input>
        <output>
            <soap:body use="literal"/>
        </output>
    </operation>
    <operation name="addMail">
        <soap:operation soapAction=""/>
        <input>
            <soap:body use="literal"/>
        </input>
        <output>
            <soap:body use="literal"/>
        </output>
    </operation>
</binding>
<service name="MailingService">
    <port name="MailingPort" binding="tns:MailingPortBinding">
        <soap:address location="http://localhost:8080/SoapService/MailingService"/>
    </port>
</service>

Я не получаю никаких ошибок в консоли ошибок, когда пытаюсь запустить ее в Firefox, а Internet Explorer отображает только Loading... и ничего более.

1 Ответ

3 голосов
/ 02 ноября 2011

SOAP необходимо отправлять через POST, а не GET.

Кроме того, похоже, что ваши заголовки WS-Messaging неверны. На самом деле, я даже не вижу их.

Попробуйте выполнить этот вызов с помощью клиента .NET («Добавить ссылку на службу») и смотреть по проводам с помощью Fiddler или что-то подобное, чтобы увидеть, что происходит. Затем сделайте то же самое.

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