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,有错误请指出,谢谢!

posted @ 2012-02-28 09:12  Maxfong  阅读(528)  评论(0编辑  收藏  举报