Javascript 如何使用 HTML 发送 SOAP 请求并接收响应?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/28582872/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 02:02:15  来源:igfitidea点击:

How can I send a SOAP request and receive a response using HTML?

javascripthtmlweb-servicessoapwsdl

提问by Kyle

I would like to send a number to a SOAP"server"(I don't know if I can call it a server, correct me if I'm wrong) and receive a response using HTML, I've seen many questions with answers containing examples of sending an XML request such as below, but I have no idea on how to receive and see a response on HTML, sorry I'm new to SOAP.

我想将一个数字发送到SOAP“服务器”(我不知道我是否可以称其为服务器,如果我错了,请纠正我)并使用HTML接收响应,我已经看到很多问题的答案包含发送 XML 请求的示例,如下所示,但我不知道如何接收和查看HTML上的响应,抱歉,我是SOAP新手。

P.S.: Of course, by HTML I meant JavaScript within the HTML :P

PS:当然,我所说的 HTML 是指 HTML 中的 JavaScript :P


Server: Here


服务器:这里

Thanks in Advance!

提前致谢!

<html>

<head>
    <title>SOAP JavaScript Client Test</title>
    <script type="text/javascript">
        function soap() {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open('POST', 'http://192.168.0.251:9080/wsa/wsa1', true);

            // build SOAP request
            var sr =
                '<?xml version="1.0" encoding="utf-8"?>' +
                '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:services-progress-com:notavailable">' +
                '<soapenv:Header/>' +
                '<soapenv:Body>' +
                '<urn:lnestagio>' +
                '<urn:vvalor>5</urn:vvalor>' +
                '</urn:lnestagio>' +
                '</soapenv:Body>' +
                '</soapenv:Envelope>';

            xmlhttp.onreadystatechange = function() {
                    if (xmlhttp.readyState == 4) {
                        if (xmlhttp.status == 200) {

                            alert('done use firebug to see response');
                        }
                    }
                }
                // Send the POST request
            xmlhttp.setRequestHeader('Content-Type', 'text/xml');
            xmlhttp.send(sr);
            // send request
            // ...
        }
    </script>
</head>

<body>
    <form name="Demo" action="" method="post">
        <div>
            <input type="button" value="Soap" onclick="soap();" />
        </div>
    </form>
</body>
<html>

SOAP's XML from my server

来自我的服务器的 SOAP 的 XML

    <wsdl:definitions xmlns:tns="urn:services-progress-com:ys:server" xmlns:S2="urn:services-progress-com:sys:server:Estagio" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:prodata="urn:schemas-progress-com:xml-prodata:0001" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:S1="urn:soap-fault:details" xmlns="http://schemas.xmlsoap.org/wsdl/" name="Estagio" targetNamespace="urn:services-progress-com:sys:server">
<wsdl:documentation>
Author=sys, EncodingType=DOC_LITERAL, WSA_Product=10.2B07 - N/A
</wsdl:documentation>
<wsdl:types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" targetNamespace="urn:soap-fault:details">
<element name="FaultDetail">
<complexType>
<sequence>
<element name="errorMessage" type="xsd:string"/>
<element name="requestID" type="xsd:string"/>
</sequence>
</complexType>
</element>
</schema>
<schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:services-progress-com:sys:server:Estagio">
<element name="lnestagio">
<complexType>
<sequence>
    <element name="vvalor" nillable="true" type="xsd:decimal"/> <!-- Here I think he gets the number I sent -->
</sequence>
</complexType>
</element>
<element name="lnestagioResponse">
<complexType>
<sequence>
<element name="result" nillable="true" type="xsd:string"/>
<element name="vcalc" nillable="true" type="xsd:decimal"/> <!-- And it returns the number multiplied by 2 -->
</sequence>
</complexType>
</element>
</schema>
</wsdl:types>
<wsdl:message name="FaultDetailMessage">
<wsdl:part name="FaultDetail" element="S1:FaultDetail"/>
</wsdl:message>
<wsdl:message name="Estagio_lnestagio">
<wsdl:part name="parameters" element="S2:lnestagio"/>
</wsdl:message>
<wsdl:message name="Estagio_lnestagioResponse">
<wsdl:part name="parameters" element="S2:lnestagioResponse"/>
</wsdl:message>
<wsdl:portType name="EstagioObj">
<wsdl:operation name="lnestagio">
<wsdl:input message="tns:Estagio_lnestagio"/>
<wsdl:output message="tns:Estagio_lnestagioResponse"/>
<wsdl:fault name="EstagioFault" message="tns:FaultDetailMessage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="EstagioObj" type="tns:EstagioObj">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="lnestagio">
<soap:operation soapAction="" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="EstagioFault">
<soap:fault name="EstagioFault" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="EstagioService">
<wsdl:port name="EstagioObj" binding="tns:EstagioObj">
<wsdl:documentation/>
<soap:address location="http://localhost:9080/wsa/wsa1"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

回答by sylozof

Well, a SOAP server is designed to receive SOAP requests and send SOAP responses.

嗯,SOAP 服务器旨在接收 SOAP 请求并发送 SOAP 响应。

Since SOAP is basically XML, instead of expecting an HTML response from the server, it would be more appropriate to look for a mean to parse the XML of the SOAP response and display it in HTML.

由于 SOAP 基本上是 XML,因此与其期望来自服务器的 HTML 响应,不如寻找一种方法来解析 SOAP 响应的 XML 并将其显示为 HTML。

But as I'm typing this answer, I think you may have misunderstood the goal of a SOAP server. It seems to me that you want to display the raw SOAP response directly to the client browser. But a SOAP server is not intended to work that way.

但是当我输入这个答案时,我认为您可能误解了 SOAP 服务器的目标。在我看来,您希望直接向客户端浏览器显示原始 SOAP 响应。但是 SOAP 服务器并不打算以这种方式工作。

Typically a SOAP server is used by another server, by doing a SOAP request to it and then parsing the SOAP response. And this "other server" may be, for example, an HTTP server.

通常,另一个服务器使用 SOAP 服务器,通过向它发出 SOAP 请求,然后解析 SOAP 响应。例如,这个“其他服务器”可能是一个 HTTP 服务器。

Let's take an example. I want to know the weather forecast of my city for tomorrow. I go to dummyweatherforecast.com and type the name of my city in the search field. But dummyweatherforecast.com does not store all the weather forecasts by itself. It may instead contact a SOAP server (specifically designed to provide weather forecasts) with a SOAP request containing the name of my city. The SOAP server returns a SOAP response with different weather information (sunny/cloudy, temperature, etc.) and then dummyweatherforecast.com processes this SOAP response (that is, as a reminder, XML) to display it to the client with a beautiful sentence like "It will be sunny tomorrow, with 86°F. Take your swimsuit !" ornamented with a beautiful sun iconography.

让我们举个例子。我想知道我所在城市明天的天气预报。我访问 dummyweatherforecast.com 并在搜索字段中输入我所在城市的名称。但是 dummyweatherforecast.com 不会自行存储所有天气预报。相反,它可能会使用包含我所在城市名称的 SOAP 请求联系 SOAP 服务器(专门设计用于提供天气预报)。SOAP 服务器返回一个带有不同天气信息(晴天/阴天、温度等)的 SOAP 响应,然后 dummyweatherforecast.com 处理这个 SOAP 响应(即作为提醒,XML),用漂亮的句子显示给客户端就像“明天会是晴天,华氏 86 度。穿上你的泳衣!” 饰有美丽的太阳肖像。

As you see, the client doesn't even know that a SOAP communication is held between dummyweatherforecast.com and the SOAP server. And this how SOAP is used : by servers themselves, and rarely directly by clients. This is what we call "web services", even though this term refers to a more general set of technologies used to make computers talk to each others.

如您所见,客户端甚至不知道 dummyweatherforecast.com 和 SOAP 服务器之间进行了 SOAP 通信。这就是 SOAP 的使用方式:由服务器本身使用,而很少由客户端直接使用。这就是我们所说的“网络服务”,尽管该术语指的是一组更通用的技术,用于使计算机相互通信。

I hope this brightened your mind a little bit.

我希望这能让你的头脑稍微清醒一点。

PS : by the way, the link you give for your server points to an IP not available publicly (192.168 adresses are for private networks).

PS:顺便说一下,您为服务器提供的链接指向一个不公开的 IP(192.168 地址用于专用网络)。