Titanium suds.js的理解

代码部分:

/* *
* Suds: A Lightweight JavaScript SOAP Client    一个轻量级的SOAP客户端
* Copyright: 2009 Kevin Whinnery (http://www.kevinwhinnery.com)    版权:xxx
* License: http://www.apache.org/licenses/LICENSE-2.0.html    
* Source: http://github.com/kwhinnery/Suds    源码地址
*/
function SudsClient(_options) {
   // A generic extend function - thanks MooTools    //定义默认变量,修改变量
   function extend(original, extended) {     // 传入原件和扩展数据
    extended = extended || {};     // 是否拥有对象,木有则创建对象
     for ( var key  in extended) {     // 遍历对象
       if (extended.hasOwnProperty(key)) {     // 是否拥有此方法
        original[key] = extended[key];     // 将extended自身的方法添加到原件中
      }
    }
     return original;     // 返回原件
  }
  
   // Check if an object is an array    //查看一个对象是否为数组
   function isArray(obj) {
     return Object.prototype.toString.call(obj) == '[object Array]';     // 获取对象类型
  }
  
   // Grab an XMLHTTPRequest Object    //创建一个XMLHTTPRequest对象
   function getXHR() {
     var xhr;
     if (window.XMLHttpRequest) {
      xhr =  new XMLHttpRequest();
    }
     else {
      xhr =  new ActiveXObject("Microsoft.XMLHTTP");
    }
     return xhr;     // 有对象了
  }
  
   // Parse a string and create an XML DOM object //通过解析string创建一个XMLDOM对象
   function xmlDomFromString(_xml) {     // 传进来一个xml格式的string
     var xmlDoc =  null;    
     if (window.DOMParser) {     // 判断浏览器支持
      parser =  new DOMParser();
      xmlDoc = parser.parseFromString(_xml,"text/xml");     // 格式成xmlDoc
    }
     else {
      xmlDoc =  new ActiveXObject("Microsoft.XMLDOM");
      xmlDoc.async = "false";     // 关闭异步
      xmlDoc.loadXML(_xml);     // 加载
    }
     return xmlDoc;     // 返回
  }
  
   //  Convert a JavaScript object to an XML string - takes either an    //将对象(最好是JSON)为XML string
   function convertToXml(_obj) {
     var xml = '';    
     if (isArray(_obj)) {     // 先看一下对象是否为数组
       for ( var i = 0; i < _obj.length; i++) {
        xml += convertToXml(_obj[i]);
      }
    }  else {
       // For now assuming we either have an array or an object graph //假设我们拥有数组或对象任意一个
       for ( var key  in _obj) {
        xml += '<'+key+'>';
         if (isArray(_obj[key]) || ( typeof _obj[key] == 'object' && _obj[key] !=  null)) {
          xml += convertToXml(_obj[key]);
        }
         else {
          xml += _obj[key];
        }
        xml += '</'+key+'>';
      }
    }
     return xml;     // 方法就是遍历整个_obj,再单独遍历单个,将key作为节点,值为值
  }
  
   //  Client Configuration //客户端配置
   var config = extend({
    endpoint:'http://localhost',     // 这些都是默认配置,在不修改的情况下使用
    targetNamespace: 'http://localhost',  // 目标命名空间
    envelopeBegin: '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:ns0="PLACEHOLDER" 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/">',
    headerBegin: '<soap:Header>',
    headerNode:'head',
    headerEnd: '</soap:Header>',
    bodyBegin:'<soap:Body>',
    envelopeEnd: '</soap:Body></soap:Envelope>',
    timeout: 5000
  },_options);     // _options参数传入需要修改的部分

   //  Invoke a web service
   this.invoke =  function(_soapAction,_body,_callback,_error,_header) {     // 对象调用方法//不需要的直接不传
     // Build request body    
     var body = _body;     // body应该是一个对象样式,转成xml格式
     var header = _header;     // 设置header
    
     // Allow straight string input for XML body - if not, build from object
     if ( typeof body !== 'string') {         // 传入的参数判断
      body = '<'+_soapAction+' xmlns="'+config.targetNamespace+'">';
      body += convertToXml(_body);     // 配置格式
      body += '</'+_soapAction+'>';
    } // 最终得到xml

     var ebegin = config.envelopeBegin;
    config.envelopeBegin = ebegin.replace('PLACEHOLDER', config.targetNamespace);
    
     // Build Soapaction header - if no trailing slash in namespace, need to splice one in for soap action
     var soapAction = '';     // 这段是将_soapAction添加到url中,判定是否有'/'在最后
     if (config.targetNamespace.lastIndexOf('/') != config.targetNamespace.length - 1) {    
      soapAction = config.targetNamespace+'/'+_soapAction;
    }
     else {
      soapAction = config.targetNamespace+_soapAction;
    }
    
     // POST xml 到 服务终结点
     var xhr = getXHR();     // 创建对象
    xhr.onload =  function() {     // 回调函数执行
      _callback.call( this, xmlDomFromString( this.responseText));     // 将值转成XMLDOM格式
    };
    xhr.onerror =  function() {
      _error.call();     // 回调错误代码
    }
    xhr.setTimeout(config.timeout);     // 延迟执行时间
     var sendXML = '';    
     if(!header) {     // 参数_header暂时木有用到,设置另外的xml doc
        sendXML = config.envelopeBegin+body+config.envelopeEnd;         // 发送到值
    }  else {
         // Allow straight string input for XML body - if not, build from object
         if ( typeof header !== 'string') {     // 设置需要的sendXML
          header = '<'+_soapAction+' xmlns="'+config.targetNamespace+'">';
          header += convertToXml(_header);
          header += '</'+_soapAction+'>';
        }
        sendXML = config.envelopeBegin+config.headerBegin+header+config.headerEnd+config.bodyBegin+body+config.envelopeEnd;
    }
    xhr.open('POST',config.endpoint);     // open方法
        xhr.setRequestHeader('Content-Type', 'text/xml');  // 请求头类型
        xhr.setRequestHeader('Content-Length', sendXML.length);     // 设置长度,节省资源?
        xhr.setRequestHeader('SOAPAction', soapAction);     // 设置SOAPAction
         if (config.authorization !== undefined) {     // 授权
xhr.setRequestHeader('Authorization', 'Basic ' + config.authorization);
}
        xhr.send(sendXML);     // 发送出去
  };
}

 

使用部分:

var value = '';
var suds =  new SudsClient({
    endpoint : url
});

try {
    suds.invoke('', '',  function(xmlDoc) {
         var results = xmlDoc.documentElement.getElementsByTagName('EmementName');
         if(results && results.length > 0) {
            value = results.item(0).text;
        }
    });
catch(e) {
    Ti.API.error('Error: ' + e);

此处使用了GET方法,去掉了很多方法,表示可以使用!

新人初学js,有错误请指出,谢谢!

你可能感兴趣的:(Titanium)