在webgap错误中由ajax调用SOAP webservice

时间:2014-04-24 08:28:05

标签: ajax web-services cordova soap ripple

我在尝试在我的应用程序中设置工作网络服务时遇到问题我正在使用Phonegap。我需要从现有的Web服务获取数据。我发现通过使用一个简单的ajax请求,这应该是有效的。我没有正确使用ajax请求吗?

我可以在此处找到我尝试拨打的网络服务:http://ws.swinggift.com/SGServices.asmx

编辑:我在http://wsdlbrowser.com/上对其进行了测试,并且我正在恢复我的xml文件,该网站如何运作?

我在ripple模拟器中工作,所以我有一个跨域代理。 我怀疑我的请求标题可能已关闭?

我得到的错误: 无法加载资源:服务器响应状态为400(错误请求)(10:26:26:851 |错误,网络)   在https://rippleapi.herokuapp.com/xhr_proxy?tinyhippos_apikey=ABC&tinyhippos_rurl=http%3A//ws.swinggift.com/SGServices.asmx%3Fop%3DGetVouchers

(我无法公开我的登录代码)

我的测试html文件:

<html>
    <head>
        <title>Calling Web Service from jQuery</title>
        <script type="text/javascript"            src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js">
</script>
        <script type="text/javascript">
            $(document).ready(function() {
                $("#btnCallWebService").click(function(event) {
                    var wsUrl = "http://ws.swinggift.com/SGServices.asmx?op=GetVouchers";

                    var soapRequest =
                            '<?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>' +
                            '<GetVouchers xmlns="http://tempuri.org/">' +
                            '<logoncode>ICantGiveYouThis</logoncode>' +
                            '</GetVouchers>' +
                            '</soap:Body>' +
                            '</soap:Envelope>';

                    $.ajax({
                        type: "POST",
                        url: wsUrl,
                        contentType: "text/xml; charset=utf-8",
                        dataType: "xml",
                        crossDomain: true,
                        data: soapRequest,
                        beforeSend: function(XMLHttpRequest) {
                            XMLHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
                            XMLHttpRequest.setRequestHeader("SOAPAction", "http://tempuri.org/GetVouchers");
                            XMLHttpRequest.setRequestHeader("Accept", "application/xml, text/xml, */*");
                        },
                        success: processSuccess,
                        error: processError
                    });
                });
            });

            function processSuccess(data, status, req) {
                if (status === "success")
                    $("#response").text($(req.responseXML));
            }

            function processError(data, status, req) {
                console.log(req.responseText + " " + status);
            }

        </script>
    </head>
    <body>
        <h3>
            Calling Web Services with jQuery/AJAX
        </h3>
        <input id="btnCallWebService" value="Call web service" type="button" />
        <div id="response" >
        </div>
    </body>
</html>

谢谢!

编辑: 我不知道它是否有帮助,但如果我做了一个&#39; GET&#39;使用此代码,如果我要求responseText

,我将获得HTML格式的网页
<html>
    <head>
        <title>SOAP JavaScript Client Test</title>

        <!-- jQuery / jQueryMobile Scripts -->
            <script src="js/jquery-1.9.1.min.js"></script>
            <script src="js/jquery.mobile-1.3.1.min.js"></script>

        <script type="text/javascript">
            function soap() {
                var xmlhttp = new XMLHttpRequest();
                xmlhttp.open('GET', 'http://ws.swinggift.com/SGServices.asmx?op=GetVouchers', true);

                // build SOAP request
                var sr =
                    '<?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>' +
                                '<GetVouchers xmlns="http://tempuri.org/">' +
                                '<logoncode>something</logoncode>' +
                                '</GetVouchers>' +
                                '</soap:Body>' +
                                '</soap:Envelope>';

                xmlhttp.onreadystatechange = function () {
                    if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
                            console.log('done' + xmlhttp.responseText);
                            $("#response").text($(xmlhttp.responseXML));
                        }
                    };

                // Send the POST request
                xmlhttp.setRequestHeader('Content-Type', 'text/xml');
                xmlhttp.setRequestHeader("Accept", "application/xml, text/xml, */*");
                xmlhttp.setRequestHeader("SOAPAction", "http://tempuri.org/GetVouchers");
                xmlhttp.send(sr);
                // send request
                // ...
            }
        </script>
    </head>
    <body>
        <form name="Demo" action="" method="post">
            <div>
                <input type="button" value="Soap" onclick="soap();" />
                <div id="response" >
            </div>
            </div>
        </form>
    </body>
    </html>

2 个答案:

答案 0 :(得分:1)

尝试设置processData: false。默认情况下,此标志为true,jQuery将XML转换为字符串。

  

By default, data passed in to the data option as an object (technically, anything other than a string) will be processed and transformed into a query string, fitting to the default content-type "application/x-www-form-urlencoded". If you want to send a DOMDocument, or other non-processed data, set this option to false.

$.ajax({
                    type: "POST",
                    url: wsUrl,
                    contentType: "text/xml; charset=utf-8",
                    dataType: "xml",
                    crossDomain: true,
                    data: soapRequest,
                    processData: false,
                    beforeSend: function(XMLHttpRequest) {
                        XMLHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
                        XMLHttpRequest.setRequestHeader("SOAPAction", "http://tempuri.org/GetVouchers");
                        XMLHttpRequest.setRequestHeader("Accept", "application/xml, text/xml, */*");
                    },
                    success: processSuccess,
                    error: processError
                })

答案 1 :(得分:1)

这是一个模拟器问题......现在使用上面的代码。