- 浏览: 210670 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
LinApex:
pignut_wang 写道这个做法在tomcat下面没有问题 ...
(转)用HttpServletResponseWrapper获取jsp的输出内容 -
snowing0427:
清晰是是相当清晰。。可惜只有四章、、、、
Head First 设计模式中文版 -
forrest_lv:
要的就是源码
Head First 设计模式附书源码 -
fgh2011:
哥们,不全啊
Head First 设计模式中文版 -
qiyuanmei:
不全中文版的
Head First Design Patterns(Head First 设计模式)
再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参数必须写成 <name></name>wqj,还有更多参数一样写,使用名称匹配
- // 传入的参数数量可以不等于(多于或少于)方法要求的参数
- //
- // 调用java(xfire) 发布的webService
- // 传入的参数必须与调用方法的参数数量相等,且按传入值的顺序进行匹配
- //
- var para = "<name></name>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/\">" +
- "<soap:body>"</soap:body> +
- "<" + this.method + " xmlns=\"" + ns + "\">" +
- (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/\">" +
- "<soap:body>"</soap:body> +
- "<" + this.method + " xmlns=\"" + ns + "\">" +
- paraXML +
- "<!----> + 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);
- },
- getParaXML : function(wsdl)
- {
- var objNode = null;
- var rtnValue = "";
- //java(xfire)
- var ell = this.getElementsByTagName(wsdl,"xsd:element");
- if(ell.length == 0)
- {
- //c#
- ell = this.getElementsByTagName(wsdl,"s:element");
- }
- for(var i = 0; i < ell.length; i++)
- {
- if(this.getElementAttrValue(ell[i],"name") == this.method)
- {
- objNode = ell[i];
- break;
- }
- }
- if(objNode == null) return rtnValue;
- //java(xfire)
- ell = this.getElementsByTagName(objNode,"xsd:element");
- if(ell.length == 0)
- {
- //c#
- ell = this.getElementsByTagName(objNode,"s:element");
- }
- if(ell.length == 0) return rtnValue ;
- var hash = new Hash();
- if(this.options.data != null && this.options.data.clean != "")
- {
- hash = this.options.data.split("&").toHash("=");
- }
- for(var i = 0; i < ell.length; i++)
- {
- var paraName = this.getElementAttrValue(ell[i],"name");
- rtnValue = rtnValue + this.getSingleXML(paraName,hash);
- }
- return rtnValue;
- },
- getSingleXML : function (name,hash)
- {
- name = name.trim();
- var rtnValue = "";
- if(hash.hasKey(name))
- {
- rtnValue = hash.get(name);
- }
- rtnValue = "<" + name + ">" + xmlscc(rtnValue) + "<!----> + name + ">"
- return rtnValue;
- },
- getBackData: function(xml)
- {
- var rtnValue = "";
- //java(xfire)
- var soap = this.getElementsByTagName(xml,"ns1:out");
- if(soap.length == 0)
- {
- //c#
- soap = this.getElementsByTagName(xml,this.method + "Result");
- }
- return soap[0].childNodes[0].nodeValue;
- },
- getElementsByTagName : function(objNode,tagName)
- {
- //tagName 形式如 xsd:element ,写出tag的全称
- var ell;
- if(this.isIE())
- {
- ell = objNode.getElementsByTagName(tagName);
- }
- else
- {
- if(tagName.contains(":")) tagName = tagName.split(":")[1];
- ell = objNode.getElementsByTagName(tagName);
- }
- return ell;
- },
- getElementAttrValue : function(objNode,attrName)
- {
- var rtnValue = "";
- if(objNode == null) return rtnValue;
- if(objNode.attributes[attrName] + "" == "undefined")
- {
- if(objNode.attributes.getNamedItem(attrName) != null)
- rtnValue = objNode.attributes.getNamedItem(attrName).nodeValue ;
- }
- else
- {
- if(objNode.attributes[attrName] != null)
- rtnValue = objNode.attributes[attrName].value;
- }
- return rtnValue;
- },
- isIE : function()
- {
- var isMSIE = /*@cc_on!@*/false;
- return isMSIE;
- }
- });
- Array.extend({
- toHash : function (splitChar)
- {
- var hash = new Hash({});
- for(var i=0;i<this.length;i++)
- {
- if(this[i].split(splitChar).length == 1) contrnue;
- var key = this[i].split(splitChar)[0].trim();
- var value = this[i].split(splitChar)[1].trim();
- hash.set(key, value);
- }
- return hash;
- }
- });
- function xmlscc(strData)
- {
- strData=strData.replace(/&/g, "&");
- strData=strData.replace(/>/g, ">");
- strData=strData.replace(/"<");
- strData=strData.replace(/"/g, """);
- strData=strData.replace(/'/g, "'");
- return strData;
- }
js 代码
- <script type=< span="">"text/javascript">
- var service ;
- function ajaxRequest()
- {
- var url = "http://localhost:88/webservicedemo.asmx";
- //设置webService传入参数
- //
- //注意:
- //
- // 调用webservice(如例子中的webservicedemo.asmx)
- // HelloTo(String name) 针对name参数必须写成name=wqj ,还有更多参数一样写,使用&符号分隔(name=11&age=20&.....),使用名称匹配
- // 传入的参数数量可以不等于(多于或少于)方法要求的参数
- var para = "name=wqj";
- var op = {
- data:para,
- onComplete: showResponse,
- onFailure:showError,
- update:'ajaxBack'
- };
- service = new WebService(url,"HelloTo",op);
- service.request();
- return false;
- }
- function showError(obj)
- {
- //obj 是一个xmlHttpRequest对象
- alert("error");
- }
- function showResponse(requestText,requestXML)
- {
- //requestText 返回的文本
- //requestXML 返回的XML
- // service.getBackData 就是取出返回的XML中,实际需要的数据
- //经过测试兼容 IE,FF
- alert(service.getBackData(requestXML));
- }
- </script>
- JavaScriptSOAP.rar (47.1 KB)
- 描述: js调用webservice示例
- 下载次数: 1869
- JavaScriptSOAP(V2).rar (49.5 KB)
- 描述: js,sope第二版
- 下载次数: 3685
评论
16 楼
up2vs
2007-11-19
Webservice一般是应用的跨域共享。在一个域了产生调用的几率应该很小。
及时用一些跨域手段实现调用,效率应该也会受到影响。
我暂时还想不出在什么应用里面用ajax直接调用webservice有什么优势和便利。
及时用一些跨域手段实现调用,效率应该也会受到影响。
我暂时还想不出在什么应用里面用ajax直接调用webservice有什么优势和便利。
15 楼
pignut_wang
2007-11-17
非常感谢楼上的朋友分享你的修改.
最近因为工作的关系,少上网了,没有及时回复,还请谅解.
最近因为工作的关系,少上网了,没有及时回复,还请谅解.
14 楼
yza0088
2007-11-13
继续修改:有时我们传递的参数可能是一段HTML,这样的话如果采用楼主的方法。那么无论采用什么分割符传递的HTML片段都可能被截断。
因此options.data直接传递Hash
修改代码如下:
因此options.data直接传递Hash
修改代码如下:
// var hash = new Hash(); // if(this.options.data != null && this.options.data.clean != "") // { // hash = this.options.data.split("&").toHash(" = "); //Edit by:yza 2007/11/13 // } // for(var i = 0; i < ell.length; i++) // { // var paraName = this.getElementAttrValue(ell[i],"name"); // rtnValue = rtnValue + this.getSingleXML(paraName,hash); // } for(var i = 0; i < ell.length; i++) { var paraName = this.getElementAttrValue(ell[i],"name"); rtnValue = rtnValue + this.getSingleXML(paraName,this.options.data); }
13 楼
yza0088
2007-11-13
最近有个项目正好用上楼主的js封装,这里谢过!
但我发现当传递html字符串的时候,会有截断现象。
因此做了以下修改:
"="两边加了空格,这样当参数为xml或html串时就不会有问题了。
但在拼data时可千万记得用" = "而不是"="
但我发现当传递html字符串的时候,会有截断现象。
因此做了以下修改:
hash = this.options.data.split("&").toHash(" = ");
"="两边加了空格,这样当参数为xml或html串时就不会有问题了。
但在拼data时可千万记得用" = "而不是"="
12 楼
afcn0
2007-10-24
跨域不麻烦,甚至更简单,script tag回调函数比XHR还简单
11 楼
gazhangting
2007-10-24
用javascript联webservice没什么意义,因为脚本不能跨域访问,就算勉强可以实现,也很麻烦.而用webservice要意义就是要跨平台,跨域.以前也用AJAX连过,可以后来发现一点意义也没有
10 楼
pignut_wang
2007-10-23
kidfang
这个怎么调用,点"执行"按钮报错?
确认一下,你的webservice地址是不是
http://localhost:88/webservicedemo.asmx
还句话说,通过这个url,是不是能访问到?
我觉得应该就是这个问题
这个怎么调用,点"执行"按钮报错?
确认一下,你的webservice地址是不是
http://localhost:88/webservicedemo.asmx
还句话说,通过这个url,是不是能访问到?
我觉得应该就是这个问题
9 楼
hideto
2007-10-19
用Jester调用REST Web Service比简单不少
8 楼
kidfang
2007-10-19
这个怎么调用,点"执行"按钮报错?
7 楼
williamy
2007-10-11
请问和ajax比有什么优势,不明白其动机
6 楼
bladechan
2007-08-24
厉害,谢谢
5 楼
pignut_wang
2007-08-08
不同的技术有不同的用途嘛
4 楼
carmansky
2007-08-07
WebService就是不能上传太大的文件.当然WebService主要是用来集成的..
顶之.
顶之.
3 楼
network-eagle
2007-08-03
学习了。.js 的功能能做到这么强大呀...研究研究...
2 楼
pignut_wang
2007-07-27
神奇?
应该说是通用,呵呵
应该说是通用,呵呵
1 楼
shmilyLT
2007-07-26
好神奇,最近正好在搞webService
发表评论
-
基于mootools重写js(tab,tree)控件包
2007-07-13 18:43 8116以前写过一个js包,里面的tab和tree都是纯粹用js的fu ... -
一个js的menu和tree的例子
2007-06-22 12:40 7120利用相同的数据实现menu和tree的例子 对于相同的数据,但 ... -
spry 资料连接收集
2007-04-27 13:19 32081. spry框架初步入门 http://www.ite ... -
(转)使用 JSON 进行数据传输
2007-04-19 20:46 5318在异步应用程序中发送 ... -
javascript的事件模型
2007-04-06 13:38 3501看到好文章就贴过来了,留着慢慢看 -------------- ... -
效果不错的 Radio/Checkbox 自定义外观
2007-04-06 13:33 2767在别的地方看到这个文章,看了演示觉得还不错,先转过来,有时间研 ... -
自己写的一个js包
2007-04-06 13:17 2283在项目中总是用到各种js脚本,总结了一下,打成一个包,方便以后 ... -
一个免费css tab制作工具
2007-04-06 12:58 2569快速可视化制作列表 可以选择不同的风格和颜色,支持超过 ...
相关推荐
使用javascript调用webservice示例.pdf使用javascript调用webservice示例.pdf
使用javascript调用webservice示例归类.pdf
使用javascript调用webservice示例[借鉴].pdf
通过一个实例的讲解说明JavaScript是如何调用WebService,希望对大家有帮助。
Js调用webService示例,在前台页面利用javascript调用后台的webservice方法来实现先后数据的交互(demo)
使用javascript 中Ajax技术调用WebService,包括JSP和ASP.NET中两种,其中JSP的WebService使用了XFire框架。 ASP.NET中的WebService做了一个方法示例GetProgress,包含3个参数。 JSP中的WebService做了hello方法的...
js原生调用webservice接口,在IE-v11上测试通过,示例中存在参数传入失败的bug,已附源码,望指点解决的方法。
三个文档打包下载,分别详细讲述了ajax以及JavaScript调用WebService的具体用法,是学习ajax和WebService的良好示例。
JavaScript用htc实现WebService的调用
自己写的用JavaScript通过soap协议调度 webService 的例子,WebService 是用C#做的,此Demo 主要目的是为大家提供跨语言的调度方式
我们经常在Silverlight中与服务器交互,例如Silverlight和SharePoint交换信息,常用的方式是通过Javascript利用xmlhttp向服务器端发送请求或调用Webservice。这里就涉及到同步和异步的问题,如果采用同步调用,则会...
本示例是用微软提供的webservice.htc来完成的,当然用ASP.NET AJAX也能实现,但该示例全部是JAVASCRIPT来做的,简单明了.
先总结几个要领: 1)要熟悉javascript对XML文件的加载与操作; DOM的XML操作可参考的示例:http://www.w3school.com.cn/xmldom/met_document_getelementsbytagname.asp 2)在IE下面还是要通过loadXML来转...
简介:该博客资源是关于一个基于Sanic框架实现的jsRpc(JavaScript Remote Procedure Call)框架的详细说明和示例代码。该框架提供了一种简单而高效的方式来实现跨平台的远程过程调用。 描述: 这个博客资源详细...
HELM2WebService 如何在Tomcat 8.0或更高版本上安装: 在下载HELM2WebService战争文件将war文件重命名... 要调用WebService,下面是一些使用Java的示例。 受保护的静态响应验证(字符串表示法)抛出URISyntaxException
一个 AppBuilder 混合示例,它使用 ASP.Net 表单身份验证来控制对启用 asmx ajax 的 Web 服务方法的访问。 当表单身份验证会话超时但仅在调用受保护的 Web 服务方法时,混合应用程序将自动拒绝访问并将用户带到登录...
体验.net 2.0 的优雅(1) -- 异步WebService调用 ASP.NET 2.0页面框架的几点新功能 ASP.NET 2.0 中收集的小功能点 asp.net2.0中的webpart使用小记 2.0问题、错误解决办法 ASP.NET 2.0使用Web Part创建应用程序之二...
**命名空间前缀会自动插入到未分发到 AppExchange 的托管包中,但对 @RemoteAction 方法的 Javascript 调用除外,并且在 actionFunction 中,所有 webservice 包引用都必须引用部署代码的命名空间前缀才能正确引用...
14.2.5 异步调用webservice 274 14.3 wcf开发 276 14.3.1 定义wcf服务契约和引入 14.3.1 wcf服务契约 277 14.3.2 构架wcf服务,运行wcf 14.3.1 服务 281 14.3.3 生成wcf服务代理的 14.3.1 代码文件 283 ...