2007
04.18


我常常聽到有人說Flex只要Flex Builder就好,Flex Data Service不用裝沒關係(我也聽過說沒有用的),基本上這樣的說詞算對也算不對,因為端看您專案開發所需的功能來決定,如果您的時間夠多,您就算不用Flex Data Service(以下簡稱FDS)也無所謂,只要您有能力跟時間自己寫一個類似的Server Service就可以了,不過就本人的觀點,這樣的說詞稍微有些偏激,剛好要示範FDS中的Flex Proxy Service,所以就把這段給記憶下來,順便讓大家知道FDS裡面的功能在幹嘛。

 我們先寫一段連接Yahoo即時新聞的示範,http://tw.news.yahoo.com/rss/realtime 是Yahoo即時新聞的RSS檔,當我們連結進去後可以發現他的結構為這樣:

Flex Proxy Service

因應這個規則,我們將XML中的item全部擷取出來,並秀在DataGrid裡面,所以我們要拿到root.channel.item裡的資料列表,最簡單的寫法如下:

<?xml version="1.0″ encoding="utf-8″?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
 <mx:Style>
  Button,DataGrid{
   font-size:12px;
  }
 </mx:Style>
 
 <mx:HTTPService id="yahooNews"
  url="http://tw.news.yahoo.com/rss/realtime
  showBusyCursor="true"/>
 <mx:Button x="21″ y="24″ label="連接非Domain內的XML"
  click="yahooNews.send();"/>
 <mx:DataGrid id="resultDg" x="21″ y="54″
  dataProvider="{yahooNews.lastResult.rss.channel.item}"
  width="381″ height="153″/>
 
</mx:Application>

讚啊,寫完後執行居然給我跳出失敗(如下圖)。那是當然的,因為這個動作可是違規的存取外部資料喔,那怎麼辦呢?Flex Proxy Service

有寫過ActionScript的人一定腦中跳出一個答案,就是使用一個叫crossdomain.xml的檔案,沒錯就是這招,用了這招就可以跨網域存取了,但是接下來又會衍伸出第二個問題,最好您有強大的交涉手腕,讓Yahoo願意因為做個練習,就在他們的網站中放置一個這樣的檔案。好糗呀

每次一到這,大家就開始洩氣了,Flash好囉說喔,幹嘛要搞的這麼麻煩,(這一切都是為了安全性 *小小聲說*),這時候FDS中的Flex Proxy Service就是您的救星了,Flex Proxy Service顧名思義,就是讓提供Flash的Server能提供Proxy的功能,替您擷取遠端的檔案,這樣一來就能製造該XML的提供者為同一台機器的假象(我知道用假象怪怪的,但是還是忍不住用一下),所以您可以打開 proxy-config.xml 這個檔案,並將 http://tw.news.yahoo.com/ 這段網址加入即可,加入的範例如下:

    <destination id="DefaultHTTP">
        <properties>
            <dynamic-url>
             http://tw.news.yahoo.com/*
            </dynamic-url>
      </properties>
    </destination>

當然您也可以用Flex Builder中的[File > new File]的功能,用Advance的選項製作出一個連結檔案,會較容易管理,最後在 HTTPService 中加入一段屬性宣告 useProxy="true"就可以啟用Proxy功能了,執行效過如下圖,終於可以順利完成了。

Flex Proxy Service

<?xml version="1.0″ encoding="utf-8″?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<!–
跨網域存取可用FDS的proxy Services,必需要去設定
C:fds2jrun4serversdefaultflexWEB-INFflexproxy-config.xml
的檔案.
–>
 <mx:Style>
  Button,DataGrid{
   font-size:12px;
  }
 </mx:Style>
 
 <mx:HTTPService id="yahooNews"
  url="http://tw.news.yahoo.com/rss/realtime"
  useProxy="true" showBusyCursor="true"/>
 <mx:Button x="21″ y="24″ label="連接非Domain內的XML"
  click="yahooNews.send();"/>
 <mx:DataGrid id="resultDg" x="21″ y="54″
  dataProvider="{yahooNews.lastResult.rss.channel.item}"
  width="381″ height="153″/>
 
</mx:Application>

後記:

若是不想跟DefaultHTTP的Tag混在一起,那可以自己新開一個Tag,例如:

    <destination id="anistar">
        <properties>
            <dynamic-url>
             http://tw.news.yahoo.com/*
            </dynamic-url>
      </properties>
    </destination>

若寫成這樣,HTTPService 要記得加入屬性 destination="anistar"才行。


相關文章:
  • Facebook 的ActionScript API 更新到 3.3版
  • 用ActionScript讀取相片中的exif資訊
  • 現場直擊Flash/Flex特效瘋-8/26活動內容預告
  • Bitmap與BitmapData
  • Flex/Flash/AIR 如何開啟bmp圖檔
  • 本文引用:
    文章內容由宋志峰[ANISTAR]撰寫,引用分享請以鏈結形式註明出處與原始作者。

    5 comments so far

    Add Your Comment
    1. hi, 宋老師
      flex data service是否要安裝在server端,
      若我是租用網路空間(無法安裝flex data service),
      我在開發時使用livecycle data service的設定,
      那丟上server端時,是否可以作用?
      PANG

      • 頭昏了。
        留了兩次= ="

      • Server端一定要安裝Livecycle Server才能用喔…

    2. 老師你好,
      請問proxy config.xml,
      一定要在server上安裝fds後,才能找到嗎?
      若採用代管的server,我是否可在flex中給予
      絕對路徑?

      • config.xml 只有在開發階段使用而已, 發布時不需要這個檔案.