在项目过程中遇到了在html中调用webservice的情况,由于Ajax不能跨域,而且后台那边也没有给测试环境,就自己先搭了个简易的webservice,想模拟下从html中调看能调出来么?
结果很蛋疼,wsdl能拿到,但是直接访问方法就报500,不管方法是有参还是无参都会报错,仔细检查后看到tomcat上提示no SOAPAction header,没有SOAP头。。。后来看到了pignut_wang写的http://www.iteye.com/topic/98182这篇文章,太精髓了,赶紧拿来试试,果然行了。在此感谢pignut_wang的分享。
写在前面:
由于我的webservice返回的XML与pignut_wang文中提到的webservice返回的XML在内容上不太一样,测试中有点小问题,所以我对pignut_wang提供的webservice.js文件做了点小修改
代码在IE6和FF测试通过,对于c#和java(xfire)写的webservice,都测试通过
此代码原型来源于 http://www.guru4.net/ 的javascript soapclient
发现这个下载的js只能用于调用c#的webservice,所以利用mootools,重新封装,达到IE和火狐的兼容的同时,兼容java和c#
(在例子中使用的 mootools.v1.11.js 文件,做过修改)
首先,下载pignut_wang提供的JavaScriptSOAP(V2).rar
解压后将WebService.js和mootools.v1.11.js放在webservice项目下。
然后在需要调webservice服务的页面中引用这两个JS文件,并在页面中加入请求代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
<script type=
"text/javascript"
>
var
service ;
function
ajaxRequest()
{
//设置webService传入参数
//
//注意:
//
// 调用webservice(如例子中的webservicedemo.asmx)
// HelloTo(String name) 针对name参数必须写成name=wqj ,还有更多参数一样写,使用&符号分隔(name=11&age=20&.....),使用名称匹配
// 传入的参数数量可以不等于(多于或少于)方法要求的参数
var
para =
"name=tinyRed"
;
var
op = {
data:para,
onComplete: showResponse,
onFailure:showError,
update:
'ajaxBackname'
};
service =
new
WebService(url,
"hello"
,op);
service.request();
return
false
;
}
function
showError(obj)
{
//obj 是一个xmlHttpRequest对象
alert(
"error"
);
}
function
showResponse(requestText,requestXML)
{
//requestText 返回的文本
//requestXML 返回的XML
alert(service.getBackData(requestXML));
//alert(requestXML);
}
</script>
|
最后,只要在需要调服务的时候调用ajaxRequest函数就可以了,不过这个函数里面的参数是要自己事先填好的哦。