使用javascript调用webservice示例

导读:

  时间: 2007-07-05 16:59 关键字: JavaScript soap,javascript

  引用 收藏

  再javascript中使用soap调用webservice的示例代码

  代码再IE6和FF测试通过,对于c#写的webservice和java(xfire)写的,都测试过,没有问题

  此代码原型来源于 http://www.guru4.net/的javascript soapclient

  发现这个下载的js只能用于调用c#的webservice,所以利用mootools,重新封装,达到IE和火狐的兼容的同时,兼容java和c#

  (再例子中使用的 mootools.v1.11.js 文件,做过修改)

  客户端js调用代码如下

   js 代码

  

  function ajaxRequest()

  {

  var url = "http://localhost:88/webservicedemo.asmx"

  

  //设置webService传入参数

  //

  //注意:

  //

  // 调用.Net 写的webservice(如例子中的webservicedemo.asmx)

  // HelloTo(String name) 针对name参数必须写成 wqj,还有更多参数一样写,使用名称匹配

  // 传入的参数数量可以不等于(多于或少于)方法要求的参数

  //

  // 调用java(xfire) 发布的webService

  // 传入的参数必须与调用方法的参数数量相等,且按传入值的顺序进行匹配

  //

  

  var para = "wqj" 这里应该是一个标准的xml形式,源码贴出来时被虑掉了,请参看附件源码

  

  var op = {

  data:para,

  onComplete: showResponse,

  onFailure:showError,

  update:'ajaxBack'

  };

  

  var service = new WebService(url,"HelloTo",op);

  service.request();

  return false

  }

  function showError(obj)

  {

  //obj 是一个xmlHttpRequest对象

  alert("error");

  }

  function showResponse(requestText,requestXML)

  {

  //requestText 返回的文本

  //requestXML 返回的XML

  alert("ok");

  }

  WebService类的代码如下(webservice.js)

   js 代码

  

  var WSDLS = {};

  var WebService = new Class({

  

  url : ',

  method : ',

  options:

  {

  method:'GET',

  data: null,

  update: null,

  onComplete: Class.empty,

  onError:Class.empty,

  evalScripts: false,

  evalResponse: false

  },

  

  initialize: function(url,method,options)

  {

  this.url = url;

  this.method = method;

  this.options = options;

  

  },

  

  request : function()

  {

  var wsdl = WSDLS[this.url];

  if(!wsdl)

  {

  var op = {method:'GET',async: false};

  var wsdlAjax = new XHR(op).send(this.url + "?wsdl", null);

  wsdl = wsdlAjax.transport.responseXML;

  WSDLS[this.url] = wsdl;

  }

  this.setSoap(wsdl);

  },

  

  setSoap : function(wsdl)

  {

  

  var ns = (wsdl.documentElement.attributes["targetNamespace"] + "" == "undefined") ? wsdl.documentElement.attributes.getNamedItem("targetNamespace").nodeValue : wsdl.documentElement.attributes["targetNamespace"].value;

  var sr =

  " " +

  ""

  "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//">" +

  "" +

  "<"" +

  (this.options.data === null ?"":this.options.data) +

  " + this.method + ">

  

  this.options.method = 'post';

  this.options.data = null

  

  var soapaction = ((ns.lastIndexOf("/") != ns.length - 1) ? ns + "/" : ns) + this.method;

  

  var soapAjax = new Ajax(this.url,this.options);

  soapAjax.setHeader("SOAPAction", soapaction);

  soapAjax.setHeader("Content-type", "text/xml; charset=utf-8");

  soapAjax.request(sr);

  }

  

  });

  在第一个版本中存在以下问题

  1. 不能根据webservice的要求输入参数自动组织参数

  2. 没有处理返回值

  3.一旦webservice调用过程出错,会形成一个死循环(一直弹出error)

  V2 说明

  1. 解决第一版中死循环的问题

  2. 统一输入参数的传入形式(与mootools的ajax使用方式完全一致),形式如name=wqj&age=20&........

  3. 自动根据参数名对应的值,组织webservice的传入参数,只根据webservice要求的参数名查找对应的值

  与顺序不再有关系.(对于xfire中的输入参数使用名称 in0,in1........)

  传入的参数数量也不再要求一致,多的自动丢弃,少的自动传空

  4. 对于返回的XML,增加提取方法,返回需要的关键返回值(去掉XML的框框)

  详细参照附件源码,下面是部分关键代码

  WebService类的代码如下(webservice.js)

   js 代码

  var WSDLS = {};

  

  var WebService = new Class({

  

  url : ',

  method : ',

  options:

  {

  method:'GET',

  data: null,

  update: null,

  onComplete: Class.empty,

  onError:Class.empty,

  evalScripts: false,

  evalResponse: false

  },

  

  initialize: function(url,method,options)

  {

  this.url = url;

  this.method = method;

  this.options = options;

  },

  

  request : function()

  {

  var wsdl = WSDLS[this.url];

  if(!wsdl)

  {

  var op = {method:'GET',async: false};

  var wsdlAjax = new XHR(op).send(this.url + "?wsdl", null);

  wsdl = wsdlAjax.transport.responseXML;

  WSDLS[this.url] = wsdl;

  }

  

  this.setSoap(wsdl);

  },

  

  setSoap : function(wsdl)

  {

  var paraXML = this.getParaXML(wsdl);

  alert(paraXML);

  var ns = (wsdl.documentElement.attributes["targetNamespace"] + "" == "undefined") ? wsdl.documentElement.attributes.getNamedItem("targetNamespace").nodeValue : wsdl.documentElement.attributes["targetNamespace"].value;

  var sr =

  "" +

  " +

  "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//">" +

  "" +

  "<"" +

  paraXML +

  "

  

   JavaScriptSOAP.rar

  描述: js调用webservice示例

  

  

  下载

  文件名: JavaScriptSOAP.rar

  文件大小: 47 KB

  下载过的: 文件被下载或查看269 次

   JavaScriptSOAP(V2).rar

  描述: js,sope第二版

  

  

  下载

  文件名: JavaScriptSOAP(V2).rar

  文件大小: 49 KB

  下载过的: 文件被下载或查看423 次

  声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。

  相关文章: 无类语言的OOP(JavaScript描述) 给javascript library挑挑刺

  推荐链接: 即刻点击免费下载Rational最新试用版软件 IBM WebSphere 应用服务器管理免费培训活动



本文转自

http://www.javaeye.com/topic/98182
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值