javascript与webservice的通信实现代码 |
本文标签:webservice,通信 在我这里,我选择将xml直接转换为json,以便后续javascript应用的处理 。我使用.net平台构建简单的webservice 。 Request.asmx 复制代码 代码如下: using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Drawing; using System.Drawing.Imaging; namespace NightKidsServices { /// <summary> /// Service1 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] public class TestService :WebService { private static int picNum = -1; [WebMethod] public Resource GetResource() { return Resource.CreateResource("pic2", "asdfasd", 0); } [WebMethod] public string HelloWorld() { return "Hello"; } [WebMethod] public byte[] GetPic() { picNum = (picNum + 1) % 32; Image image = Image.FromFile(this.Server.MapPath("jpeg/" + (picNum+1).ToString() + ".bmp")); MemoryStream mem=new MemoryStream(); image.Save(mem, ImageFormat.Jpeg); return mem.GetBuffer(); } [WebMethod] public List<Resource> GetResourceList() { return new List<Resource>(new Resource[] { Resource.CreateResource("pic1", "jpeg/1.bmp", 0),Resource.CreateResource("pic2", "jepg/2.bmp", 0), Resource.CreateResource("pic3", "jpeg/3.bmp", 0), Resource.CreateResource("pic4", "jepg/4.bmp", 0) }); } } 以上只是一个简单的测试使用,便于后续使用javascript处理不同类型的数据 对于javascript,肯定是使用xmlhttprequest对象来访问服务器端的,不过这里为了简单,我没有考虑兼容性问题,直接使用xmlhttprequest对象(我使用chrome浏览器作为测试浏览器),为此我使用AjaxClient类来进行http操作(Post 方法),WebService类来封装处理webservice(调用AjaxClient类作为操作类),JsonConverter类处理xml数据转换为json数据 common.js(包含JsonConverter类) 复制代码 代码如下: // JavaScript Document function $(id) { return document.getElementById(id); } function GetXmlHttp() { if(window.XMLHttpRequest) return new XMLHttpRequest(); } var JsonConverter={}; JsonConverter.FlagStack=[]; JsonConverter.ConvertFromXML=function(xmlRootNode) { if(!xmlRootNode) return; var converter={}; converter.render=function(node,isArrayElement) { var returnStr=; var isArray=false; if(node.childNodes.length==1) { returnStr+=node.nodeName+: + "" + node.firstChild.nodeValue + "" ; if(node==xmlRootNode) returnStr={ + returnStr + }; return returnStr; } isOneNode=false; if(node.nodeName.match("ArrayOf*")) isArray=true; if(isArray) returnStr+=[; else { returnStr+={; if(!(isArrayElement || xmlRootNode==node)) returnStr=node.nodeName + : + returnStr; } for(var i=1;i<node.childNodes.length;i+=2) { returnStr+=this.render(node.childNodes[i],isArray) + ,; } returnStr=returnStr.slice(0,-1); if(isArray) returnStr+=]; else returnStr+=}; return returnStr; } //alert(converter.render(xmlRootNode)); return eval(( + converter.render(xmlRootNode) + )); } <SPAN style="FONT-FAMILY: verdana, courier new"><SPAN style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; WHITE-SPACE: normal"><BR></SPAN></SPAN> AjaxClient.js 复制代码 代码如下: // JavaScript Document function AjaxClient(url) { var xmlhttp=GetXmlHttp(); var request_url=url; var msgList=new Array(); var isOpen=false; var isRunning=false; xmlhttp.onreadystatechange=function() { if(xmlhttp.readyState==xmlhttp.DONE) { isRunning=false; if (xmlhttp.status==200) { msgList.push(xmlhttp.responseXML); } } } this.Open=function() { if(xmlhttp==null) xmlhttp=GetXmlHttp(); isOpen=true; if(xmlhttp==null) isOpen=false; } this.Send=function(msg) { if (isOpen) { xmlhttp.open("POST",request_url,false); //alert(request_url); xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xmlhttp.setRequestHeader("Content-length",msg==null?0:msg.length); //xmlhttp.setRequestHeader("Keep-Alive","ON"); xmlhttp.send(msg==null?"":msg); isRunning=true; } } this.GetUrl=function() { return request_url.length==0?:request_url; } this.SetUrl=function(url) { request_url=url; } this.Receive=function() { var num=0; while(!msgList.length) { num++; if (num>=20000) break; } return msgList.length==0?null:msgList.shift(); } this.Close=function() { if(!isRunning) { isOpen=false; xmlhttp=null; } } } WebService.js 复制代码 代码如下: // JavaScript Document function WebService(url) { var ajaxclient=new AjaxClient(null); var requestUrl=url; var responseMsg=null; this.Request=function(requestName,paraList) { var url=requestUrl +/ + requestName; var sendData=; ajaxclient.SetUrl(url); ajaxclient.Open(); //alert(ajaxclient.GetUrl()); if (paraList!=null) { for(var obj in paraList) sendData+=obj.toString() + = + paraList[obj] + &; sendData=sendData.slice(0,-1); } ajaxclient.Send(sendData); //ajaxclient.Close(); //responseMsg=XMLtoJSON(ajaxclient.Receive()); //for(var obj in responseMsg) // alert(obj.toString() + : + responseMsg[obj].toString()); responseMsg=ajaxclient.Receive(); } this.GetResponse=function() { return responseMsg; } } 调用很简单,只需 复制代码 代码如下: var webService=new WebService(http://localhost/NightKidsWebService/Request.asmx); webService.Request("GetResourceList",null); alert(JsonConverter.ConvertFromXML(webService.GetResponse().firstChild)); 在Request方法里面的第一个参数对应不同的服务名称,第二个参数加入对应的服务的参数表(json格式,例如:{id:123,name:nightKids}) |