最简单的SOAP示例

时间:2020-03-06 14:37:53  来源:igfitidea点击:

使用Javascript最简单的SOAP示例是什么?

为了尽可能有用,答案应该是:

  • 具有功能性(换句话说,实际上有效)
  • 发送至少一个可以在代码中其他位置设置的参数
  • 处理至少一个可以在代码的其他位置读取的结果值
  • 与大多数现代浏览器版本一起使用
  • 在不使用外部库的情况下尽可能清晰明了

解决方案

最简单的示例包括:

  • 获取用户输入。
  • 编写与此类似的XML SOAP消息
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetInfoByZIP xmlns="http://www.webserviceX.NET">
      <USZip>string</USZip>
    </GetInfoByZIP>
  </soap:Body>
</soap:Envelope>
  • 使用XHR将消息发布到Web服务URL
  • 解析Web服务的XML SOAP响应与此类似
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <soap:Body>
  <GetInfoByZIPResponse xmlns="http://www.webserviceX.NET">
   <GetInfoByZIPResult>
    <NewDataSet xmlns="">
     <Table>
      <CITY>...</CITY>
      <STATE>...</STATE>
      <ZIP>...</ZIP>
      <AREA_CODE>...</AREA_CODE>
      <TIME_ZONE>...</TIME_ZONE>
     </Table>
    </NewDataSet>
   </GetInfoByZIPResult>
  </GetInfoByZIPResponse>
 </soap:Body>
</soap:Envelope>
  • 向用户展示结果。

但是,如果没有外部JavaScript库,就会遇到很多麻烦。

除非Web服务与页面位于同一域中,否则不能使用直接的JavaScript来完成。编辑:在2008年和IE <10中,除非服务与页面位于同一域中,否则无法使用纯正的javascript完成。

如果Web服务在另一个域上[并且必须支持IE <10],则必须在自己的域上使用一个代理页面,该代理页面将检索结果并将其返回给我们。如果不需要旧的IE支持,则需要在服务中添加CORS支持。无论哪种情况,都应该使用timyates建议的lib之类的东西,因为我们不想自己解析结果。

如果Web服务在我们自己的域中,则不要使用SOAP。没有充分的理由这样做。如果Web服务在我们自己的域中,则对其进行修改,以便它可以返回JSON,从而省去了处理SOAP带来的所有麻烦的麻烦。

简短的答案是:不要从javascript发出SOAP请求。使用Web服务从另一个域请求数据,如果这样做,则在服务器端解析结果并以js友好的形式返回它们。

托马斯:

JSON是前端使用的首选,因为它是javascript。因此,我们无需处理任何XML。因此,SOAP不使用库就很麻烦。有人提到SOAPClient,这是一个很好的库,我们从项目开始就使用它。但是,它有一些局限性,我们不得不重写其中的很大一部分。它以SOAPjs的形式发布,并支持将复杂对象传递到服务器,并包含一些示例代理代码以使用来自其他域的服务。

浏览器处理XMLHttpRequest的方式有很多奇怪之处,此JS代码可在所有浏览器中使用:
https://github.com/ilinsky/xmlhttprequest

此JS代码将XML转换为易于使用的JavaScript对象:
http://www.terracoder.com/index.php/xml-objectifier

上面的JS代码可以包含在页面中,以满足我们对外部库的要求。

var symbol = "MSFT"; 
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "http://www.webservicex.net/stockquote.asmx?op=GetQuote",true);
xmlhttp.onreadystatechange=function() {
 if (xmlhttp.readyState == 4) {
  alert(xmlhttp.responseText);
  // http://www.terracoder.com convert XML to JSON 
  var json = XMLObjectifier.xmlToJSON(xmlhttp.responseXML);
  var result = json.Body[0].GetQuoteResponse[0].GetQuoteResult[0].Text;
  // Result text is escaped XML string, convert string to XML object then convert to JSON object
  json = XMLObjectifier.xmlToJSON(XMLObjectifier.textToXML(result));
  alert(symbol + ' Stock Quote: $' + json.Stock[0].Last[0].Text); 
 }
}
xmlhttp.setRequestHeader("SOAPAction", "http://www.webserviceX.NET/GetQuote");
xmlhttp.setRequestHeader("Content-Type", "text/xml");
var xml = '<?xml version="1.0" encoding="utf-8"?>' +
 '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
                'xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' +
                'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' + 
   '<soap:Body> ' +
     '<GetQuote xmlns="http://www.webserviceX.NET/"> ' +
       '<symbol>' + symbol + '</symbol> ' +
     '</GetQuote> ' +
   '</soap:Body> ' +
 '</soap:Envelope>';
xmlhttp.send(xml);
// ...Include Google and Terracoder JS code here...

另外两个选择:

  • JavaScript SOAP客户端:http://www.guru4.net/articoli/javascript-soap-client/zh/
  • 从WSDL生成JavaScript:https://cwiki.apache.org/confluence/display/CXF20DOC/WSDL+to+Javascript

使用JavaScript轻松使用SOAP Web服务->清单B

function fncAddTwoIntegers(a, b)
{
    varoXmlHttp = new XMLHttpRequest();
    oXmlHttp.open("POST",
 "http://localhost/Develop.NET/Home.Develop.WebServices/SimpleService.asmx'",
 false);
    oXmlHttp.setRequestHeader("Content-Type", "text/xml");
    oXmlHttp.setRequestHeader("SOAPAction", "http://tempuri.org/AddTwoIntegers");
    oXmlHttp.send(" \
<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' \
xmlns:xsd='http://www.w3.org/2001/XMLSchema' \
 xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> \
  <soap:Body> \
    <AddTwoIntegers xmlns='http://tempuri.org/'> \
      <IntegerOne>" + a + "</IntegerOne> \
      <IntegerTwo>" + b + "</IntegerTwo> \
    </AddTwoIntegers> \
  </soap:Body> \
</soap:Envelope> \
");
    return oXmlHttp.responseXML.selectSingleNode("//AddTwoIntegersResult").text;
}

这可能无法满足所有要求,但实际上是回答问题的开始。 (我将XMLHttpRequest()切换为ActiveXObject(" MSXML2.XMLHTTP"))。