李威 さぽている

          小說(shuō)翻譯,日語(yǔ)相關(guān)轉(zhuǎn)移至http://blog.hjenglish.com/liwei

          2011年12月6日 #

          JSONP 跨域原理小解

          最近看一些代碼時(shí),邊看邊改代碼,發(fā)現(xiàn)getJSON這個(gè)方法沒法正常使用。

          1 var sURL= "http://api.xxxxxx.com/services/feeds/   
          2    xxxxxxx?format=json&callback=?";
          3 $.getJSON(sURL, function(data) {
          4 // do something with the JSON data returned
          5 }); // end get

          究其原因,發(fā)現(xiàn)url里有個(gè)callback,這里使用的是JSONP,一種跨域技術(shù)。
          網(wǎng)上搜了下JSONP,多數(shù)都是在講如何使用,而沒有說(shuō)明為什么它能跨域,且沒有說(shuō)明url服務(wù)器端的代碼時(shí)如何生成的。
          http://www.west-wind.com/weblog/posts/2007/Jul/04/JSONP-for-crosssite-Callbacks
          這方面,上面的文章里有比較詳細(xì)的描述。

           1 function jsonp(url,callback,name, query)
           2 {                
           3     if (url.indexOf("?"> -1)
           4         url += "&jsonp=" 
           5     else
           6         url += "?jsonp=" 
           7     url += name + "&";
           8     if (query)
           9         url += encodeURIComponent(query) + "&";   
          10     url += new Date().getTime().toString(); // prevent caching        
          11     
          12     var script = document.createElement("script");        
          13     script.setAttribute("src",url);
          14     script.setAttribute("type","text/javascript");                
          15     document.body.appendChild(script);
          16 }

          客戶端的javascript代碼會(huì)有如上的操作,代碼不難,很容易理解,也就是加了一個(gè)script標(biāo)簽。

          而服務(wù)器端會(huì)返回
          callbackFunction( { "x": 10, "y": 15} );
          這樣的數(shù)據(jù)。這其實(shí)是一段javascript代碼,
          callbackFunction是方法名,
          { "x": 10, "y": 15}是參數(shù)。客戶端代碼里必須要有
          callbackFunction方法的定義。

           1 public partial class JSONP : System.Web.UI.Page
           2 {
           3     protected void Page_Load(object sender, EventArgs e)
           4     {
           5         if (!string.IsNullOrEmpty(Request.QueryString["jsonp"]) )
           6             this.JsonPCallback();
           7     }
           8 
           9     public void JsonPCallback()
          10     {
          11         string Callback = Request.QueryString["jsonp"];
          12         if (!string.IsNullOrEmpty(Callback))
          13         {
          14             // *** Do whatever you need
          15             Response.Write(Callback + "( {\"x\":10 , \"y\":100} );");
          16         }
          17 
          18         Response.End();
          19     }
          20 }

          之后客戶端會(huì)調(diào)用callbackFunction
          使用JQuery的getJSON方法后,callback部分會(huì)變成如下形式。
          callback=jQuery1710461701650187642_1326201333794&_=1326201356534
          callbackFunction自然就是
          jQuery1710461701650187642_1326201333794部分了。
          返回來(lái)的數(shù)據(jù)也會(huì)是jQuery1710461701650187642_1326201333794( { "x": 10, "y": 15} ) 這種形式。

          最后JQuery會(huì)調(diào)用匿名函數(shù)
          function(data),data即為json數(shù)據(jù)。

          JQuery已經(jīng)將客戶端部分實(shí)現(xiàn)了,服務(wù)器端也得遵循同樣的規(guī)則才能實(shí)現(xiàn)跨域。


          *這里有一點(diǎn),JQuery如何將匿名函數(shù)換名字的?有哪位大俠知道的,請(qǐng)用簡(jiǎn)單的語(yǔ)言講解下。

          posted @ 2012-01-10 21:30 李威 閱讀(353) | 評(píng)論 (0)編輯 收藏

          error code 0x80004005

          記錄一個(gè)小問(wèn)題。
          在Win7系統(tǒng)上裝一個(gè)軟件時(shí)失敗,提示2個(gè)DLL沒有注冊(cè)成功。
          于是準(zhǔn)備手動(dòng)注冊(cè)。
          運(yùn)行
          cd C:\WINDOWS\system32\
          regsvr32 xxx.dll
          后出現(xiàn)如下錯(cuò)誤:
          The module "xxx.dll" was loaded but the call to DllRegisterServer failed with error code 0x80004005.

          網(wǎng)上搜索一番后,找到如下地址
          http://forums.cnet.com/7723-12546_102-237219.html
          其中有條說(shuō)run as administrator,這是權(quán)限問(wèn)題,不過(guò)我登陸的就是管理員賬號(hào),應(yīng)該不存在這樣的問(wèn)題。

          抱著姑且一試的想法,寫了個(gè)cmd文件,右鍵run as administrator后,居然真的注冊(cè)成功了!

          看來(lái)Win7系統(tǒng)真的很安全,就算是管理員,也得來(lái)個(gè)run as administrator后才能做一些事,是在向sudo學(xué)習(xí)么?

          posted @ 2011-12-06 21:13 李威 閱讀(369) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 府谷县| 临漳县| 高安市| 边坝县| 西宁市| 甘孜县| 青田县| 普兰店市| 遂平县| 宁陕县| 敖汉旗| 南宁市| 中西区| 吕梁市| 南靖县| 保山市| 若尔盖县| 托克托县| 湖州市| 沛县| 鹿邑县| 毕节市| 平度市| 盐亭县| 瑞丽市| 禹州市| 大悟县| 阿拉善左旗| 贺州市| 大丰市| 邯郸市| 卢氏县| 城市| 汝城县| 青浦区| 平乐县| 维西| 陈巴尔虎旗| 曲阳县| 平和县| 太湖县|