如何使用Javascript连接到SOAP webservice?

时间:2018-01-09 00:51:21

标签: javascript web-services soap cors fiddler

我一直在努力让javascript使用SOAP服务好几天而无法让它工作。它可以在Excel,SOAP-UI,Fiddler,Flex中使用,但不能在HTML / Javascript中使用。 任何帮助将不胜感激。

到目前为止,我已经在Simplest SOAP example看了一个简单的例子。我按照代码替换了我的Web服务的相应部分。我得到的错误似乎都指向常见的CORS错误。

  

对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许原点'null'访问。响应的HTTP状态代码为403。

我已经四处寻找原因,并尝试了各种解决方案,但没有一个有效。

以下是我调用webservice的代码

<script type="text/javascript">
    function soap() {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open('POST', 'https://myurl', true);

        // build SOAP request
        var sr =
        '<?xml version="1.0" encoding="UTF-8"?>' + 
    '<soap:Envelope ' +
    'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" ' + 
    'xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" ' + 
    'xsi:schemalocation="http://schemas.xmlsoap.org/soap/envelope/">' +
    '<soap:Body>' +
    '<mymethod xmlns="http://my.com/server/">' +
    '<Key>123456789</Key>' +
    '</mymethod>' +
    '</soap:Body></soap:Envelope>';

     xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4) {
                if (xmlhttp.status == 200) {
                    alert('done. use firebug/console to see network response');
                }
            }
        }
        // Send the POST request
        xmlhttp.setRequestHeader('Content-Type', 'text/xml');
        xmlhttp.setRequestHeader('Authorization', 'Basic myusername/password here');
        xmlhttp.send(sr);
    }
</script>

HTML只是一个运行javascript的按钮。当我点击它时,我得到两个错误:

  

选项xxxxxxxxxxxxxx 403(禁止)

(xxxxxxxxxxxxx是我的网址)和

  

https://xxxxxxxxxxxxxxxxxxxxx:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许原点'null'访问。响应的HTTP状态代码为403。

为什么这不起作用的任何想法?另一个重要问题是为什么它在Fiddler中有效而不在我的网页上?我使用了Fiddlers composer选项卡,并输入了几乎相同的上述信息,并且工作正常。

感谢。

1 个答案:

答案 0 :(得分:0)

如果有人来这里寻找答案,这就是我想出来的。

基于上面使用代理的建议,我环顾四周,发现无法使用代理(该服务来自旧的主机,其他组件拼凑在一起)。但是,在这里建立这个想法就是我所做的。

我使用ColdFusion作为Web服务器。它具有使用.NET dll的能力。因此,我创建了一个DLL来访问SOAP服务并返回结果。我能够在ColdFusion页面中捕获此结果(使用jquery / javascript)并使用它,就像我直接从Javascript调用它一样。

所以,我想这可能是使用上面提到的 charlietfl 这样的代理的意思。