亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > AJAX > 正文

ajax跨域調用webservice的實現代碼

2024-09-01 08:33:44
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了 ajax跨域調用webservice服務例子和理解,最近ajax訪問webservice遇到跨域的問題,網上搜索資料,總結如下
 

  最近ajax訪問webservice遇到跨域的問題,網上搜索資料,總結如下(很多都是覺得人家總結不錯的復制下來)

  <<用JSON來傳數據,靠JSONP來跨域>>

  先上我的已實現代碼:

  前端代碼:

$.ajax({ type: "get", url: "http://localhost/Service1.asmx/getElevatorStatusJsonData?jsoncallback=?", dataType: "jsonp", jsonp: "json", data: "", success: function (result) { var data = eval(result); for (var i = 0; i < data.length; i++) { alert(data[i].ID + "--" + data[i].Name); } }, error: function (a, b, c) { alert(c); } }); 

  服務端代碼:

 /// <summary> /// 獲取狀態數據信息 /// </summary> /// <returns></returns> [WebMethod] public void getElevatorStatusJsonData() { List<List<DeviceInfo>> elevatordatas = new List<List<DeviceInfo>>(); List<SendDicdate> searchList = XmlSerializeHelper.XmlDeserializeFromFile<List<SendDicdate>>(@ConfigUtil.servicePath + ConfigUtil.getConfigByKey("xmlPath") + "查詢指令信息.xml", Encoding.UTF8); foreach (SendDicdate item in searchList) { string key = item.portno + "-" + item.bordrate + "-" + item.sendtype; List<DeviceInfo> deviceInfoList = (List<DeviceInfo>)Context.Cache.Get(key); elevatordatas.Add(deviceInfoList); } String result = ""; DataContractJsonSerializer json = new DataContractJsonSerializer(elevatordatas.GetType()); using (MemoryStream stream = new MemoryStream()) { json.WriteObject(stream, elevatordatas); result = Encoding.UTF8.GetString(stream.ToArray()); } String jsoncallback = HttpContext.Current.Request["jsoncallback"]; result = jsoncallback + '(' + result + ')'; HttpContext.Current.Response.Write(result); HttpContext.Current.Response.End(); }

  c#

   以上是調用c#服務端的實現代碼,下面的是java端的,參數可能有差異,但原理是相通的

  java:

  

String callbackFunName = context.Request["callbackparam"];  context.Response.Write(callbackFunName + "([ { /"name/":/"John/"}])");

  PS:客戶端的jsonp參數是用來通過url傳參,傳遞jsonpCallback參數的參數名,比較拗口,通俗點講:

  jsonp: ""

  jsonpCallback:""

  順帶一提:在chrome瀏覽器里,還可以在服務端設置header信息context.Response.AddHeader("Access-Control-Allow-Origin", "*");來達到跨域請求的目的,并且不需要設置ajax以下參數

  

dataType : "jsonp",  jsonp: "callbackparam",  jsonpCallback:"jsonpCallback1"

  以正常ajax請求方式就可以獲得數據。

下面是原理,看別人講解的,感覺很有道理:

  1、一個眾所周知的問題,Ajax直接請求普通文件存在跨域無權限訪問的問題,甭管你是靜態頁面、動態網頁、web服務、WCF,只要是跨域請求,一律不準;

  2、不過我們又發現,Web頁面上調用js文件時則不受是否跨域的影響(不僅如此,我們還發現凡是擁有”src”這個屬性的標簽都擁有跨域的能力,比如

  3、于是可以判斷,當前階段如果想通過純web端(ActiveX控件、服務端代理、屬于未來的HTML5之Websocket等方式不算)跨域訪問數據就只有一種可能,那就是在遠程服務器上設法把數據裝進js格式的文件里,供客戶端調用和進一步處理;

  4、恰巧我們已經知道有一種叫做JSON的純字符數據格式可以簡潔的描述復雜數據,更妙的是JSON還被js原生支持,所以在客戶端幾乎可以隨心所欲的處理這種格式的數據;

  5、這樣子解決方案就呼之欲出了,web客戶端通過與調用腳本一模一樣的方式,來調用跨域服務器上動態生成的js格式文件(一般以JSON為后綴),顯而易見,服務器之所以要動態生成JSON文件,目的就在于把客戶端需要的數據裝入進去。

  6、客戶端在對JSON文件調用成功之后,也就獲得了自己所需的數據,剩下的就是按照自己需求進行處理和展現了,這種獲取遠程數據的方式看起來非常像AJAX,但其實并不一樣。

  7、為了便于客戶端使用數據,逐漸形成了一種非正式傳輸協議,人們把它稱作JSONP,該協議的一個要點就是允許用戶傳遞一個callback 參數給服務端,然后服務端返回數據時會將這個callback參數作為函數名來包裹住JSON數據,這樣客戶端就可以隨意定制自己的函數來自動處理返回數 據了。

  聰明的開發者很容易想到,只要服務端提供的js腳本是動態生成的就行了唄,這樣調用者可以傳一個參數過去告訴服務端“我想要一段調用XXX函數的js代碼,請你返回給我”,于是服務器就可以按照客戶端的需求來生成js腳本并響應了。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title></title><script type="text/javascript">// 得到航班信息查詢結果后的回調函數var flightHandler =function(data){ alert('你查詢的航班結果是:piao價 '+ data.price +' 元,'+'余piao '+ data.tickets +' 張。'); }; // 提供jsonp服務的url地址(不管是什么類型的地址,最終生成的返回值都是一段javascript代碼)var url ="http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler"; // 創建script標簽,設置其屬性var script = document.createElement('script'); script.setAttribute('src', url);  // 把script標簽加入head,此時調用開始 //document.getElementsByTagName('head')[0].appendChild(script); </script></head><body></body></html><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>Untitled Page</title><script type="text/javascript" src=jquery.min.js"></script><script type="text/javascript"> jQuery(document).ready(function(){ $.ajax({ type: "get", async: false, url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998", dataType: "jsonp", jsonp: "callback",//傳遞給請求處理程序或頁面的,用以獲得jsonp回調函數名的參數名(一般默認為:callback) jsonpCallback:"flightHandler",//自定義的jsonp回調函數名稱,默認為jQuery自動生成的隨機函數名,也可以寫"?",jQuery會自動為你處理數據 success: function(json){ alert('您查詢到航班信息:piao價: '+ json.price +' 元,余piao: '+ json.tickets +' 張。'); }, error: function(){ alert('fail'); } }); }); </script></head><body></body></html>

是不是有點奇怪?為什么我這次沒有寫flightHandler這個函數呢?而且竟然也運行成功了!哈哈,這就是jQuery的功勞了,jquery在處理jsonp類型的ajax時(還是忍不住吐槽,雖然jquery也把jsonp歸入了ajax,但其實它們真的不是一回事兒),自動幫你生成回調函數并把數據取出來供success屬性方法來調用,是不是很爽呀?



注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久久国产精品| 亚洲www在线| 久久久精品国产| 欧美精品成人91久久久久久久| 国产精品狼人色视频一区| 精品久久久久久久久久ntr影视| 亚洲美女在线看| 2019中文字幕全在线观看| 久久91精品国产91久久跳| 综合欧美国产视频二区| 高清日韩电视剧大全免费播放在线观看| 日产精品久久久一区二区福利| 日韩高清电影免费观看完整| 午夜精品久久久久久久男人的天堂| 一区二区三区久久精品| 中文字幕亚洲无线码a| 国产精品va在线播放| 在线日韩第一页| 欧美日韩精品在线视频| 日av在线播放中文不卡| 久久精品亚洲94久久精品| 亚洲成人在线网| 精品国内亚洲在观看18黄| 日韩高清中文字幕| 日本最新高清不卡中文字幕| 7777精品久久久久久| 国产91免费观看| 狠狠爱在线视频一区| 国产亚洲精品一区二区| 国产日产亚洲精品| 亚洲区bt下载| www国产亚洲精品久久网站| 欧洲美女免费图片一区| 97色在线观看免费视频| 国产精品久久久久影院日本| 成人福利网站在线观看11| 色偷偷888欧美精品久久久| 日韩欧美在线播放| 日韩久久精品电影| 在线成人一区二区| 欧美大片免费观看| 91久久久久久久一区二区| 日韩在线观看你懂的| 亚洲一区二区三区四区在线播放| 欧美精品一区二区三区国产精品| 久久在线视频在线| 国内精品美女av在线播放| 欧美富婆性猛交| 精品日韩视频在线观看| 国产精品1234| 欧美最猛性xxxx| 国产日韩精品一区二区| 亚洲全黄一级网站| 91亚洲国产成人久久精品网站| xxav国产精品美女主播| 久久精品99无色码中文字幕| 2018中文字幕一区二区三区| 日韩麻豆第一页| 色妞久久福利网| 97国产精品免费视频| 国产拍精品一二三| 欧美乱大交xxxxx| 57pao成人永久免费视频| 成人国产精品av| 在线电影欧美日韩一区二区私密| 国产精品 欧美在线| 久久久久久久久久国产| 欧美激情一区二区久久久| 成人精品网站在线观看| 国产精品欧美亚洲777777| 午夜精品三级视频福利| 国产做受69高潮| 日韩一区视频在线| 亚洲欧洲在线播放| 欧美日韩国产一区中文午夜| 国产国产精品人在线视| 国产精品夜间视频香蕉| 国产精品都在这里| 欧美日韩高清在线观看| 亚洲精品www久久久| 久久久久亚洲精品成人网小说| 国外成人在线视频| 亚洲国产日韩一区| 欧美在线视频一二三| 日韩精品日韩在线观看| 久久黄色av网站| 亚洲韩国欧洲国产日产av| 国产精品香蕉av| 精品久久久久久久久中文字幕| 在线播放国产一区中文字幕剧情欧美| 欧美放荡办公室videos4k| 欧美亚洲免费电影| 一区二区三区四区视频| 最近2019年好看中文字幕视频| 日韩激情av在线免费观看| 国产69精品久久久久99| 国产成人一区三区| 清纯唯美亚洲综合| 国产小视频91| 欧美亚洲视频在线看网址| 久久久国产精品亚洲一区| 中文字幕亚洲天堂| 98精品国产高清在线xxxx天堂| 精品亚洲永久免费精品| 国产亚洲在线播放| 久久精品99久久久久久久久| 亚洲国模精品一区| 亚洲精品视频久久| 国产一区二区三区网站| 欧美黄色三级网站| 亚洲激情第一页| 国产精品欧美在线| 久久亚洲精品一区二区| 国产精品久久久久影院日本| 亚洲欧洲日本专区| 亚洲免费伊人电影在线观看av| 久久国产精品偷| 欧洲亚洲免费视频| 国产精品国内视频| 7777精品久久久久久| 成人午夜激情网| 久久久在线视频| 精品久久久久久中文字幕一区奶水| 国产精品电影在线观看| 久久精品国产免费观看| 亚洲在线观看视频网站| 亚洲午夜色婷婷在线| 国产一区二区精品丝袜| 欧美疯狂xxxx大交乱88av| 亚洲美女视频网| 日韩精品免费视频| 精品无人区乱码1区2区3区在线| 欧美日韩免费区域视频在线观看| 欧美一级高清免费播放| 日韩影视在线观看| 91精品国产91久久久久久吃药| 日韩免费观看视频| 精品国产一区二区在线| 成人免费网站在线观看| 亚洲第一精品夜夜躁人人爽| 久久久久久久国产精品视频| 日韩在线视频导航| 国产精品视频一区国模私拍| 国产免费一区视频观看免费| 久久久亚洲天堂| 中文字幕欧美在线| 国产日韩视频在线观看| 欧美日韩在线视频一区| 韩国视频理论视频久久| 亚洲精品久久久久久久久久久久久| 亚洲午夜精品视频| 美日韩精品免费观看视频| 欧美视频免费在线| 亚洲国产精品大全| 91久久精品一区| 性欧美xxxx视频在线观看| 国色天香2019中文字幕在线观看| 亚洲影影院av| 亚洲精品综合精品自拍| 欧美韩国理论所午夜片917电影| 国产精品三级美女白浆呻吟| 欧美在线一级va免费观看| 日本一区二区在线播放| 91免费人成网站在线观看18|