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

  • 相关阅读:
    javap -c 字节码含义
    redis --- lua 脚本实现原子操作
    感想
    AbstractAdvisingBeanPostProcessor---spring aop 处理器
    spring 自定义解析类
    protobuf3 语法解析
    Java设计模式之builder模式
    工厂和抽象工厂模式
    RESTful入门
    RocketMQ入门
  • 原文地址:https://www.cnblogs.com/maxfong/p/2370972.html
Copyright © 2020-2023  润新知