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); //发送出去
};
}
* 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);
}
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,有错误请指出,谢谢!