Appcelerator Titanium中的SOAP问题(使用suds.js) - 不适用于Android

时间:2011-06-06 12:08:18

标签: android soap titanium appcelerator

我们正在使用Appcelerator Titanium在我们的学习中编写一个小型“家庭设备控制”应用程序。我们在Java中编写了一个后端,它连接到我们的前端应用程序,其接口可以通过SOAP调用接收请求。因此我们使用了suds.js.一切都适用于iOS,但Android中似乎没有任何事情发生,我们不知道为什么。 :-( 首先,我们希望提供用户登录来授权用户。名称和密码将发送到后端,后端随后提供用户令牌。在iOS中一切正常,Android似乎有以下代码的问题,我通过不同的测试评论注意到,因为此代码中的注释未显示在开发人员控制台中:

suds.invoke('login', callparams, function(xmlDoc) {
        Titanium.API.info("Test after function is called");

            var results = xmlDoc.documentElement.getElementsByTagName('return');
Titanium.API.info("another test comment");
            Titanium.API.info(results);

            if (results && results.length>0) {
                var isAdmin = results.item(0).getElementsByTagName('admin');
                if(isAdmin.item(0).text == "true") {
                    Titanium.API.info("isAdmin: true");
                    Titanium.App.Properties.setBool('isAdmin', true);
                } else {
                    Titanium.API.info("isAdmin: false");
                    Titanium.App.Properties.setBool('isAdmin', false);
                }

                var userToken = results.item(0).getElementsByTagName('userToken');
                Titanium.API.info("userToken: " + userToken.item(0).text);
                Titanium.App.Properties.setString('userToken', userToken.item(0).text); 
                Titanium.App.Properties.setString('username', username.value);

                //Rein oder raus???
                //alert("Login erfolgreich! \n isAdmin: " + isAdmin.item(0).text + " \n userToken: " + userToken.item(0).text)

                //Aufruf Hauptmenüfenster
                openWindow('js/menue.js', 'Hauptmenü', true);

                } else {
                    var resultsError = xmlDoc.documentElement.getElementsByTagName('S:Fault');
                    var errorString = resultsError.item(0).getElementsByTagName('faultstring');
                    Titanium.API.info("error: " + errorString.item(0).text);
                    alert(errorString.item(0).text);
                }
        });

后端的url-link:http://localhost:8888 Localhost,因为后端正在我的桌面上运行以进行测试。我不确定该请求是否会收到后端。

提前感谢您的帮助! 此致,Stefan

整个代码: app.js的一部分:(对不起德国代码评论)

// Checkbox bekommt Eventlistener, der Angibt ob das Passwort gespeichert werden soll.
checkbox.addEventListener('click', function(e) {
    if(Titanium.App.Properties.getBool('loginAuto') == true){
        imageUrl = 'images/checkbox_unchecked.png';
        Titanium.App.Properties.setBool('loginAuto', false);
        Titanium.API.info('Setze loginAuto = false');
    } else if(Titanium.App.Properties.getBool('loginAuto') == false){
        imageUrl = 'images/checkbox_checked.png';
        Titanium.App.Properties.setBool('loginAuto', true);
        Titanium.API.info('Setze loginAuto = true');
    }
    checkbox.image = imageUrl;  
});

// Loginbutton bekommt Eventlistener, der bei Klick den Login durchführt.
loginBtn.addEventListener('click', function(e) {
    // Datenbank wird erneut initialisiert, falls noch nicht vorhanden
    var db_userdata = Titanium.Database.install("db/myHome4.sqlite", 'myHome4');
// Für den Fall das Benutzername und Passwort gespeichert werden sollen, werden sie hier in die DB geschrieben.
    if(Titanium.App.Properties.getBool('loginAuto') == true){
        Titanium.API.info('Speichere Name und Password in der Datenbank.');

        db_userdata.execute("DELETE FROM login");
        db_userdata.execute("INSERT INTO login (id, name, password) VALUES (1, ?, ?)", username.value, password.value);
        Titanium.App.Properties.setString('loginName', username.value);
        Titanium.App.Properties.setString('loginPassword', password.value);

    } else {
        db_userdata.execute("DELETE FROM login");
    }
    db_userdata.close();

    var url = Titanium.App.Properties.getString('url') + '/services?wsdl'; 

    var callparams = {
            username: username.value,
            password: password.value
        };
/* Im Folgenden der suds Client (SOAP Client), der die SOAP Abfragen ausführt und Werte zurück liefert. 
    Login-Vorgang und Aufruf des Hauptmenüfensters
*/  

    Titanium.API.info(Titanium.App.Properties.getString('url'));

    var suds = new SudsClient({
        endpoint: url,
        targetNamespace: Titanium.App.Properties.getString('url')
    });

    Titanium.API.info("TEST1111");

    try {
        Titanium.API.info("Test before function");
        suds.invoke('login', callparams, function(xmlDoc) {
        Titanium.API.info("Test after function is called");

            var results = xmlDoc.documentElement.getElementsByTagName('return');
Titanium.API.info("another test comment");
            Titanium.API.info(results);

            if (results && results.length>0) {
                var isAdmin = results.item(0).getElementsByTagName('admin');
                if(isAdmin.item(0).text == "true") {
                    Titanium.API.info("isAdmin: true");
                    Titanium.App.Properties.setBool('isAdmin', true);
                } else {
                    Titanium.API.info("isAdmin: false");
                    Titanium.App.Properties.setBool('isAdmin', false);
                }

                var userToken = results.item(0).getElementsByTagName('userToken');
                Titanium.API.info("userToken: " + userToken.item(0).text);
                Titanium.App.Properties.setString('userToken', userToken.item(0).text); 
                Titanium.App.Properties.setString('username', username.value);

                //Rein oder raus???
                //alert("Login erfolgreich! \n isAdmin: " + isAdmin.item(0).text + " \n userToken: " + userToken.item(0).text)

                //Aufruf Hauptmenüfenster
                openWindow('js/menue.js', 'Hauptmenü', true);

                } else {
                    var resultsError = xmlDoc.documentElement.getElementsByTagName('S:Fault');
                    var errorString = resultsError.item(0).getElementsByTagName('faultstring');
                    Titanium.API.info("error: " + errorString.item(0).text);
                    alert(errorString.item(0).text);
                }
        });
    } catch(e) {
        alert(e);
        Ti.API.error('Error: ' + e);
    }
});
/* Eventlistener für den Logout-Button, bei Klick wird das Menüfenster geschlossen und die Variablen username, userToken und is
 isadmin gelöscht
 */
Ti.App.addEventListener('eventLogout', function(event)
{
    Titanium.App.Properties.removeProperty("username");
    Titanium.App.Properties.removeProperty("userToken");
    Titanium.App.Properties.removeProperty("isAdmin");
    Titanium.API.info("Lösche Einstellungen...");
    win2.close();
});

suds.js:

/*
 * Definition der Parameter, die für SOAP Client notwendig sind
 *
*/

var url = Titanium.App.Properties.getString('url') + '/services?wsdl';

/**
* Suds: A Lightweight JavaScript SOAP Client
* Copyright: 2009 Kevin Whinnery (http://www.kevinwhinnery.com)
* License: http://www.apache.org/licenses/LICENSE-2.0.html
* Source: http://github.com/kwhinnery/Suds
*/
function SudsClient(_options) {
  function isBrowserEnvironment() {
    try {
      if (window && window.navigator) {
        return true;
      } else {
        return false;
      }
    } catch(e) {
      return false;
    }
  }

  function isAppceleratorTitanium() {
    try {
      if (Titanium) {
        return true;
      } else {
        return false;
      }
    } catch(e) {
      return false;
    }
  }

  //Funktion zur Erweiterung von Variablen (Objekten)
  function extend(original, extended) {
    for (var key in (extended || {})) {
      if (original.hasOwnProperty(key)) {
        original[key] = extended[key];
      }
    }
    return original;
  }

  //Prüfung ob ein Objekt ein Array ist
  function isArray(obj) {
    return Object.prototype.toString.call(obj) == '[object Array]';
  }

  //Holt per get eine XMLHTTPRequest Object
  function getXHR() {
    return Titanium.Network.createHTTPClient();
  }

  //Aus einem String wird ein XML DOM object
  function xmlDomFromString(_xml) {
    xmlDoc = Titanium.XML.parseString(_xml);
    return xmlDoc;
  }

  // Konvertiert ein Javascript OBbjekt in ein XML string 
  function convertToXml(_obj, namespacePrefix) {
    var xml = '';
    if (isArray(_obj)) {
      for (var i = 0; i < _obj.length; i++) {
        xml += convertToXml(_obj[i], namespacePrefix);
      }
    } else {

      for (var key in _obj) {
        if (namespacePrefix && namespacePrefix.length) {
          xml += '<' + namespacePrefix + ':' + key + '>';
        } else {
          xml += '<'+key+'>';
        }
        if (isArray(_obj[key]) || (typeof _obj[key] == 'object' && _obj[key] != null)) {
          xml += convertToXml(_obj[key]);
        }
        else {
          xml += _obj[key];
        }
        if (namespacePrefix && namespacePrefix.length) {
          xml += '</' + namespacePrefix + ':' + key + '>';
        } else {
          xml += '</'+key+'>';
        }
      }
    }
    return xml;
  }

  // Client Konfiguration
  var config = extend({
    endpoint:'https://localhost:8888/service',
    targetNamespace: 'https://localhost:8888/service?wsdl',
    envelopeBegin: '',
    envelopeEnd: ''
  },_options);

  // Aufruf web service
  this.invoke = function(_soapAction,_body,_callback) {  

    //Erstelle request body 
    var body = _body;

    //Erlaubt einen String in einen XML body einzufügen - Ansonsten wird dieser aus einem XML Objekt erzeugt.
    if (typeof body !== 'string') {
      body = '<fron:'+_soapAction+'>';
      body += convertToXml(_body);
      body += '</fron:'+_soapAction+'>';
    }

    var ebegin = config.envelopeBegin;
    config.envelopeBegin = ebegin.replace('PLACEHOLDER', config.targetNamespace);

    //Erzeugt den Soapaction header
    var soapAction = '';
    if (config.targetNamespace.lastIndexOf('/') != config.targetNamespace.length - 1) {
      soapAction = config.targetNamespace+'/'+_soapAction;
    }
    else {
      soapAction = config.targetNamespace+_soapAction;
    }

    //Sende das XML document  per HTTP_Post zum service endpoint
    var xhr = getXHR();
    xhr.onload = function() {
      _callback.call(this, xmlDomFromString(this.responseText));
    };
    xhr.open('POST',config.endpoint);
    xhr.setRequestHeader('Content-Type', 'text/xml;charset=UTF-8');
    // xhr.setRequestHeader('SOAPAction', soapAction);
    xhr.send(config.envelopeBegin+body+config.envelopeEnd);
    Titanium.API.info(config.envelopeBegin+body+config.envelopeEnd);
    Titanium.API.info("Test SUDS!");
  };

}

1 个答案:

答案 0 :(得分:1)

我认为localhost将是移动(模拟器)而不是托管计算机。尝试将Java中的端点绑定到网络中可用的计算机名称(而不是localhost)。然后将SOAP连接指向该计算机。