気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Silverlightのクロスドメイン制約

昨今、SilverlightやFlashなどでいろんなWebAPIに接続して、ちょっとしたガジェットを作ってみたいと
思っている方も結構いるのでは思います。

そこで、常に問題なるのがクロスドメイン制約の問題です。Silverlightでは接続する先のドメイン(サブドメインを含む)が
Silverlightアプリがホストされているサーバのドメインと一致してない場合、「SecurityException」が発生してしまいます。

これを回避するためには、ドメインのルートに「クロスドメインポリシーファイル」が置かれている必要があります。
Silverlightは独自の「clientaccesspolicy.xml」に加えて、Flash標準の「crossdomain.xml」にも対応しています。

「crossdomain.xml」に関してはそこそこいろいろなAPIが対応しています。
例えば、実際に試してはいないのですが、「Yahoo API」ではここに置かれています。

しかし、対応していないAPIもあります。メジャーなところで言うと「Google Data API」がそうです。
対応を求めるフォーラムも設置されていますが、今のところ動きはないようです。

Google App Engineを仲介してのクロスドメイン接続

そこで、私が試してみたのが、「Google App Engine」を介したAPIのアクセスです。「Google App Engine」は誰でもが無料で利用できる
クラウドサービスです。

まず、Silverlightアプリを「Google App Engine」にホストします。
(他の記事で、Silverlightアプリを「Google App Engine」にホストする方法を紹介していますので是非、そちらも読んでみてください。)

そして、Silverlightアプリからホストされている「Google App Engine」に接続するコードを書きます。これは
ダウンロード元のドメインに接続することになるので、クロスドメイン制約の問題はありません。
そして、「Google App Engine」から目的のWeb APIに接続するようにします。
つまり、「Silverlight」-「Google App Engine」-「Web API」という3階層のアーキテクチャにすることになります。

以下のコードは「Google App Engine」でYoutubeのおすすめエントリのFeedを取得するコードです。

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import urlfetch

class GetYoutubeFeed(webapp.RequestHandler):
  def get(self):
    result = urlfetch.fetch('http://gdata.youtube.com/feeds/api/standardfeeds/recently_featured?start-index=1')

    self.response.out.write(result.content)

application = webapp.WSGIApplication(
                                     [('/youtube_feed',GetYoutubeFeed)],
                                     debug=True)


[urlfetch]というクラスを利用すると「Google App Engine」からWeb上の他のサービスに接続して、
コンテンツを取得してくることが出来ます。

ポートはHTTP(80)とHTTPS(443)に限定されています。MethodはGET、POST、 PUT、 HEAD、DELETEが使用できます。

そして、何と!、今記事を書きながら、「Google App Engine」
ドキュメントページを開くとJava版のEarly Lookが掲載されています!!

今まで、不慣れなPythonに苦戦してきた私としては、とても嬉しいです。

Google App Engineを介した場合の認証
Google Data APIのほとんどの機能は認証を必要としています。2階層アプリケーションの場合は、クライアントとWebAPIが
直接やり取りするので特に問題ないのですが、3階層モデルになると、一旦中間層(「Google App Engine」)が
ユーザの認証情報を受け取る必要が出てきます。Googleアカウントに関してはかなりいろいろなことが出来るため、
ユーザとしても、サービスを提供する側としても、このデリケートな情報を直接扱うことは是非避けたいところです。

それを回避する方法として、Google Data APIでは「OAuth(オース)」というプロトコルを実装しています。
次回の記事で詳しく書いてみたいと思います。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/44-310b2791

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。