首頁 web前端 js教程 ajax跨域呼叫webservice的實作程式碼_javascript技巧

ajax跨域呼叫webservice的實作程式碼_javascript技巧

May 16, 2016 am 09:00 AM
ajax webservice

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

  >

  先上我的已實作程式碼:

  前端程式碼:

$.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屬性方法來調用,是不是很爽呀?

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

解決jQuery AJAX請求遇到403錯誤的方法 解決jQuery AJAX請求遇到403錯誤的方法 Feb 20, 2024 am 10:07 AM

標題:解決jQueryAJAX請求出現403錯誤的方法及程式碼範例403錯誤是指伺服器禁止存取資源的請求,通常會導致出現這個錯誤的原因是請求缺少權限或被伺服器拒絕。在進行jQueryAJAX請求時,有時會遇到這種情況,本文將介紹如何解決這個問題,並提供程式碼範例。解決方法:檢查權限:首先要確保請求的URL位址是正確的,同時驗證是否有足夠的權限來存取該資

解決jQuery AJAX請求403錯誤的方法 解決jQuery AJAX請求403錯誤的方法 Feb 19, 2024 pm 05:55 PM

jQuery是一個受歡迎的JavaScript函式庫,用來簡化客戶端端的開發。而AJAX則是在不重新載入整個網頁的情況下,透過發送非同步請求和與伺服器互動的技術。然而在使用jQuery進行AJAX請求時,有時會遇到403錯誤。 403錯誤通常是伺服器禁止存取的錯誤,可能是由於安全性原則或權限問題導致的。在本文中,我們將討論如何解決jQueryAJAX請求遭遇403錯誤

如何使用Ajax從PHP方法取得變數? 如何使用Ajax從PHP方法取得變數? Mar 09, 2024 pm 05:36 PM

使用Ajax從PHP方法取得變數是Web開發中常見的場景,透過Ajax可以實作頁面無需刷新即可動態取得資料。在本文中,將介紹如何使用Ajax從PHP方法中取得變量,並提供具體的程式碼範例。首先,我們需要寫一個PHP檔案來處理Ajax請求,並傳回所需的變數。下面是一個簡單的PHP檔案getData.php的範例程式碼:

如何解決jQuery AJAX報錯403的問題? 如何解決jQuery AJAX報錯403的問題? Feb 23, 2024 pm 04:27 PM

如何解決jQueryAJAX報錯403的問題?在開發網頁應用程式時,經常會使用jQuery來發送非同步請求。然而,有時在使用jQueryAJAX時可能會遇到錯誤代碼403,表示伺服器禁止存取。這種情況通常是由伺服器端的安全性設定所導致的,但可以透過一些方法來解決這個問題。本文將介紹如何解決jQueryAJAX報錯403的問題,並提供具體的程式碼範例。一、使

PHP 與 Ajax:建立一個自動完成建議引擎 PHP 與 Ajax:建立一個自動完成建議引擎 Jun 02, 2024 pm 08:39 PM

使用PHP和Ajax建置自動完成建議引擎:伺服器端腳本:處理Ajax請求並傳回建議(autocomplete.php)。客戶端腳本:發送Ajax請求並顯示建議(autocomplete.js)。實戰案例:在HTML頁面中包含腳本並指定search-input元素識別碼。

PHP 與 Ajax:建立動態載入內容的解決方案 PHP 與 Ajax:建立動態載入內容的解決方案 Jun 06, 2024 pm 01:12 PM

Ajax(非同步JavaScript和XML)允許在不重新載入頁面情況下新增動態內容。使用PHP和Ajax,您可以動態載入產品清單:HTML建立一個帶有容器元素的頁面,Ajax請求載入資料後將資料加入到該元素中。 JavaScript使用Ajax透過XMLHttpRequest向伺服器傳送請求,從伺服器取得JSON格式的產品資料。 PHP使用MySQL從資料庫查詢產品數據,並將其編碼為JSON格式。 JavaScript解析JSON數據,並將其顯示在頁面容器中。點選按鈕觸發Ajax請求,載入產品清單。

ajax版本有哪些 ajax版本有哪些 Nov 22, 2023 pm 02:00 PM

ajax不是一個特定的版本,而是一種使用多種技術的集合來非同步載入和更新網頁內容的技術。 ajax沒有特定的版本號,但是有一些ajax的變體或擴充:1、jQuery AJAX;2、Axios;3、Fetch API;4、JSONP;5、XMLHttpRequest Level 2;6、WebSockets;7、Server-Sent Events;8、GraphQL等等。

透過使用Ajax函數實現非同步資料交換的方法 透過使用Ajax函數實現非同步資料交換的方法 Jan 26, 2024 am 09:41 AM

如何利用Ajax函數實現非同步資料互動隨著網路和Web技術的發展,前端與後端之間的資料互動變得十分重要。傳統的資料互動方式,如頁面刷新和表單提交,已經無法滿足使用者的需求。而Ajax(AsynchronousJavaScriptandXML)則成為了實現非同步資料互動的重要工具。 Ajax透過使用JavaScript和XMLHttpRequest對象,使得網

See all articles