GOL @Wiki

Flexでサーバ連携

最終更新:

divadiva

- view
管理者のみ編集可

「FLEX Channel.Security.Error」の検索結果
Flexでサーバ連携」 から 次の単語がハイライトされています :




Flexで作成したリッチクライアントと、Javaなどで作成したサーバを連携させます。その際につまづきそうな点をメモとして書いていきたいと思います。

  1. サーバとの接続
    1. コネクション確立時のセキュリティ
    2. 同期通信について
  2. 取得したXMLの操作
    1. 名前空間には注意!

サーバとの接続

コネクション確立時のセキュリティ

サーバと通信する際は、HTTPServiceやWebServiceクラスを使用しますが、Flexアプリケーションが所属するアプリケーションドメインや、そもそもサーバが別IP、別マシンになるケースは多々あります。特にエンタープライズ環境で、サーバ側でWebサービスをインタフェースとしたロジックを提供する場合はなおさらです。
この場合、よく出るエラーは Channel.Security.Error ですが、これはサーバ側(サービス提供側)に crossdomain.xml がないからです。サーバ側がアクセスを許可している旨を表明しなければなりません。

この crossdomain.xml の置き場所ですが、デフォルトではアプリケーションドメインのトップ直下、つまりデフォルトのindex.htmlが置いてあるような場所になります。

が、「そんなとこには置けん!」というケースもあるかと思います。

その場合は、クライアント側(Flex)にて、ドメインポリシーファイルの置き場所を指定すればよいです。

Security.loadPolicyFile("http://<SERVER>:<PORT>/Foo/Bar/hoge.xml");

みたいな感じです。

ただし。HTTPServiceやWebServiceを <mx:HTTPService... あるいは <mx:WebService... みたいな感じで記述していると、<mx:Script> <![CDATA[ 以下のコードブロック部で上記の置き場所指定コードが実行される前にサーバにアクセスにいったりするので、置き場所指定コードを記述しているにもかかわらず、あいかわらずセキュリティエラーが出る・・・という状況になりかねませんので、HTTPServiceあるいはWebServiceオブジェクトの生成から全てコードブロック内で完結させるのがいいのではないでしょうか。。

同期通信について

HTTPServiceやWebServiceで同期通信できたら・・・と思うことがあります。実際、そういうニーズ(?)はたくさんあり、ネットを検索すると、いろいろ引っ掛かります。ちゃんと読んでませんが、下記のようなソリューションもあるようです。
→Synchronous data calling with Flex

でも、、このソリューション、なんかスッキリしませんね。ムリヤリ感はいなめません。そう、やはり同期通信すること自体、Flexにそぐわないのです。イベントドリブンが基本なのです。

下記のケースを考えてみましょう。
処理A();
customObj.処理();
処理B();
となっており、処理Bが customObj.処理() の結果に依存していて、かつ、
public class CustomObj {
  public function 処理() {
    webServices.send();
  }
}
となっている場合、処理BはCustomObjオブジェクト内の処理()で起動される非同期処理(つまりwebServicesの結果)の結果を待つ必要があります。したがって、単純に処理Aから処理Bまでを並べたコードにすると、CustomObjの webServices.send() の結果が返る前に処理Bが実行され、結果的に思ったような動作となりません。CustomObjからgetXXX()のような形でwebServices.send()の結果を得ようとしても、その時点でそもそもwebServices.send()の結果が返ってきていない場合は、やはり何も得られないでしょう。

ですので、イベントドリブンな実装にせざるをえません。adobeのFlex FAQにも同様の質問がありますが、結論としては「同期通信は不可能。あきらめろ。」となっています。

実装方法としては、CustomObjでカスタムイベントを定義し、webServices.send()の結果が返ってきたら、CustomObjからカスタムイベントを送出します。CustomObj利用側でそのイベントをリスンし、イベント捕捉時に実行されるハンドラ内で再び処理Bを実行すればよいのです。

取得したXMLの操作

基本的にAdobeのヘルプを参照するといいのですが。。

名前空間には注意!

~工事中~

記事メニュー
目安箱バナー