如何在javascript或Jquery中调用SOAP(XML)Web服务?

问题描述 投票:0回答:3

我正在尝试在 javascript / Jquery 中调用 asp.net webservice, 我尝试了很多例子,但不幸的是没有成功,

这是我目前正在尝试的代码,

    login("[email protected]", "123456");
    var productServiceUrl = 'http://localhost:50575/Service1.asmx?op=test'; // Preferably write this out from server side

    function login(Email, Password) {
        var soapMessage = '<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> \
<login xmlns="http://test.com/"> \
<Email>' + Email + '</Email> \
<Password>' + Password + '</Password> \
</login> \
</soap:Body> \
</soap:Envelope>';

        $.ajax({
            url: productServiceUrl,
            type: "GET",
            dataType: "xml",
            data: soapMessage,
            complete: endSaveProduct,
            error: function (a, b, c) {
                alert(a + "\n"  + b + "\n" + c);
            },
            contentType: "text/xml; charset=\"utf-8\""
        });

        return false;
    }

    function endSaveProduct(xmlHttpRequest, status) {
        $(xmlHttpRequest.responseXML)
    .find('loginResult')
    .each(function () {
        alert( $(this).find('Message').text());
    });
    }

请帮帮我, 预先感谢。

javascript jquery
3个回答
4
投票

存在多个问题:

  • 您正在向不同的域发送请求,因此除非该域发送跨源资源共享 (CORS) 标头
    Access-Control-Allow-Origin: *
    或特别允许您的源
  • ,否则它将无法工作
  • 您正在使用
    GET
    ,而您应该使用
    POST
    ,因为在 SOAP over HTTP 中,信封必须位于请求正文中。
  • jQuery 始终认为您的数据是
    application/x-www-form-urlencoded
    ,除非您将
    processData
    设置为 false。仅设置
    contentType
    只会使标题谎言,并不会真正改变这一点。
    实际上,如果
    data
    参数是字符串,则这是不正确的。

您的目标域似乎不允许 CORS,因此无法直接从客户端执行此操作。您必须使用服务器代理来执行请求。

如果他们允许 CORS,你会这样做:

var soapMessage = '<?xml version="1.0" encoding="utf-8"?>\
                    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">\
                      <soap12:Body>\
                        <login xmlns="http://tastygo.com/">\
                          <BBMID>string</BBMID>\
                          <Email>string</Email>\
                          <Password>string</Password>\
                        </login>\
                      </soap12:Body>\
                    </soap12:Envelope>';

$.ajax( "http://m.allaccesstnt.com/AATnTWebservices/Webservices/Userwebservice.asmx", {

    contentType: "application/soap+xml; charset=utf-8",
    type: "POST", //important
    dataType: "xml",
    data: soapMessage

});

但这不起作用,因为服务器不允许 OPTIONS,浏览器必须使用 OPTIONS 来确定是否允许跨域请求:

OPTIONS http://m.allaccesstnt.com/AATnTWebservices/Webservices/Userwebservice.asmx 405 (Method Not Allowed)

第二个问题是:

XMLHttpRequest cannot load http://m.allaccesstnt.com/AATnTWebservices/Webservices/Userwebservice.asmx. Origin http://stackoverflow.com is not allowed by Access-Control-Allow-Origin.

0
投票
    login("[email protected]", "123456");
    var productServiceUrl = 'http://localhost:50575/Service1.asmx?op=test'; // Preferably write this out from server side

    function login(Email, Password) {
        var soapMessage = '<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> \
<login xmlns="http://test.com/"> \
<Email>' + Email + '</Email> \
<Password>' + Password + '</Password> \
</login> \
</soap:Body> \
</soap:Envelope>';

        $.ajax({
            url: productServiceUrl,
            type: "POST",
            dataType: "xml",
            data: soapMessage,
            complete: endSaveProduct,
            error: function (a, b, c) {
                alert(a + "\n"  + b + "\n" + c);
            },
            contentType: "text/xml; charset=\"utf-8\""
        });

        return false;
    }

    function endSaveProduct(xmlHttpRequest, status) {
        $(xmlHttpRequest.responseXML)
    .find('loginResult')
    .each(function () {
        alert( $(this).find('Message').text());
    });
    }

-1
投票

只需添加 http://m.allaccesstnt.com/AATnTWebservices/Webservices/Userwebservice.asmx/test & 在网络服务器端添加标头

© www.soinside.com 2019 - 2024. All rights reserved.