今回は、開発時に壁にぶち当たりそうなところ、というか当たった所を4つ、説明します。
- 「フローサービス管理コンソールAPI」のData Sourcesへの追加
- RESTの通信環境
- テキストを書く
- IF文
「フローサービス管理コンソールAPI」のData Sourcesへの追加
これが一番重要な部分です。以下の手順になります。
画面上部で、AppData>Data Sources を選択します。
画面右上の+ボタンから、RESTを選択します。
タブから「Import a configuration file」を選択します。
接続用の設定ファイルを指定すると・・・
loginという名前で追加されました。
今回はデスクトップ上のapiauth.xmlを使用していることがわかります。
肝心の設定ファイルの内容ですが、先人の知恵から以下のようなXMLになっています。
<?xml version="1.0"?>
<application xmlns="http://wadl.dev.java.net/2009/02"
xmlns:siena="http://schemas.microsoft.com/MicrosoftProjectSiena/v1/WADL"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xh="http://www.w3.org/1999/xhtml">
<siena:header serviceid="Infoteria" author="Infoteria" fileversion="1.0" formatversion="1.0" />
<resources base="http://192.168.1.1:28080/mcapi/">
<resource path="auth/login">
<method name="POST" id="login">
<request>
<param name="userName" style="query" fixed="/guest"/>
<param name="password" style="query" fixed="guest"/>
</request>
<response siena:resultform="single">
<representation mediaType="application/json">
<siena:responsetype>
<![CDATA[
{
"resultpath": "/result",
"resulttype": "ResultRoot",
"types": [
{
"name": "ResultRoot",
"type": "object",
"fields": [
{
"name": "data",
"type": "data"
}
]
},
{
"name": "data",
"type": "object",
"fields": [
{
"name": "sessionId",
"type": "string"
}
]
}
]
}
]]>
</siena:responsetype>
</representation>
</response>
</method>
</resource>
</resources>
</application>
このXMLはWeb Application Description Language (WADL)であり、以下の内容になっています。
- siena:headerにInfoteriaという名前を設定する
- ResourcesエレメントにWARPの動作しているサーバー「http://192.168.1.1:28080/mcapi/」を設定する
- resourceエレメントにAPIのパス「auth/login」を設定する
- methodエレメントにMicrosoft "Project Siena"内での名前「login」を設定する
- request/paramエレメントでAPIのパラメーターを定義する
認証用のauth/loginには必須パラメーター「userName」と「password」があり、今回は、デフォルトの/guestユーザーの情報で固定値を指定しています。 - responseエレメント以下でAPIのレスポンスのJSONの構造を定義する
この定義も難しくはなく以下のように読んでいけます。
- /resultはResultRootというタイプです
- ResultRootはオブジェクトでフィールドにdataというタイプのdataをもっています
- dataはオブジェクトでフィールドにはsessionIdというStringを持っています
今回ほしい情報は、ログインに成功した場合のセッションID「sessionId」になりますね。
1つできれば、もう大丈夫。
ログ情報を取得するAPIの定義も読み込みます。以下resourceエレメント部分です。
<resource path="log/system/show">
<method name="GET" id="showlog2">
<request>
<param name="X-As-SessionId" style="header" required="true"/>
<param name="type" style="query" required="true"/>
<param name="level" style="query" required="true"/>
</request>
<response siena:resultform="single">
<representation mediaType="application/json">
<siena:responsetype>
<![CDATA[
{
"resultpath": "/result",
"resulttype": "ResultRoot",
"types": [
{
"name": "ResultRoot",
"type": "object",
"fields": [
{
"name": "status",
"type": "string"
},
{
"name": "data",
"type": "data"
}
]
},
{
"name": "data",
"type": "object",
"fields": [
{
"name": "maxPageNumber",
"type": "string"
},
{
"name": "log",
"type": "log"
}
]
},
{
"name": "log",
"type": "array",
"itemtype": "logentry"
},
{
"name": "logentry",
"type": "object",
"fields": [
{
"name": "row",
"type": "string"
},
{
"name": "dateTime",
"type": "string"
},
{
"name": "level",
"type": "string"
},
{
"name": "catagory",
"type": "string"
},
{
"name": "thread",
"type": "string"
},
{
"name": "message",
"type": "string"
}
]
}
]
}
]]>
</siena:responsetype>
</representation>
</response>
</method>
</resource>
auth/loginと異なる部分は以下の点です。
- メソッドがGET
- リクエストヘッダーに「X-As-SessionId」を設定している
- 各パラメーターにfixedな値が無い
- レスポンス定義内でarrayが使用されている
ログを取得するAPIは「log/system/show」で、パラメーターには「type」と「level」を指定するようにしています。
リクエストヘッダーの「X-As-SessionId」へは、auth/loginで取得したsessionIdを指定する必要があります。これは「フローサービス管理コンソールAPI」の仕様です。
Microsoft "Project Siena"のData Sourcesで読み込んだ情報を見てみると、apilog.xmlを使用していて、showlog2という名前で登録されています。
また、loginメソッドのときには無かった、Parametersの部分に3つのパラメーターがあるのが確認できます。
こ れでData Sourcesに追加できましたので、Galleries/Text GalleryなどのItemsに設定できます。今回は、ログインボタンでログインして取得したsessionIdをInput Text「Data Default=SESSIONID」へ保存して、その値を使用してText Galleryがログ情報を読み込むようにしました。
ログインボタンのOnSelectの設定例
UpdateContext({SESSIONID:Infoteria!login()!data!sessionId})
処理を言葉にすると「Infoteriaで定義したlogin()を実行して、そのレスポンスのdataのsessionIdをSESSIONIDに設定する」ということです。
GalleryのData/Itemsの設定例
Infoteria!showlog2(SESSIONID, "asteria", "info")!data!log
showlog2に3つのパラメーターを設定しています。
- X-As-SessionId:SESSIONIDの値
- type:asteriaという固定文字列
- level:infoという固定文字列
処理を言葉にすると「Infoteriaで定義したshowlog2()に3つの引数を設定して実行し、そのレスポンスのdataのlogをData/ItemsというGalleryのアイテムデータに設定する」ということです。
引数の「asteria」と「info」という固定値については、ADNのログの内容を取得するAPIのヘルプを参照してください。
RESTの通信環境
今回WARPとMicrosoft "Project Siena"を同一環境で動作させた場合、WARPへリクエストが飛びませんでした。その影響で、192.168.1.1と192.168.1.2という別環境で作成しています。
テキストを書く
上記の「Data Sourcesへの追加」の最後のログインボタン部分に記述していますが、Input Textなどのテキスト値を設定するには、以下のように書く必要があります。
UpdateContext({SESSIONID:"新しい値"})
Input Textのデータを指定して、そのデータを更新するということのようです。
IF文
IF文の書き方でELSEの書き方がわからなかったのですが、Ifの第3引数にfalseのときの条件文を設定することで動作しました。
If(ThisItem!level = "WARN",
RGBA(255, 192, 0, 1),
If(ThisItem!level = "ERROR",
RGBA(255, 0, 0, 1),
If(ThisItem!level = "FATAL", RGBA(192, 0, 0, 1))
)
)
ThisItemのlevelの値が"WARN"だったら255,192,0の色、"ERROR"だったら255,0,0の色、"FATAL"だったら192.0.0にしてということです。
太字の部分が第3引数になります。ここではIF文を設定して、そのIF文の第3引数(イタリックの部分)にまたIF文を設定しています。こちらはfalseのときは何もしないです。
以上、壁の克服でした。
RESTの設定さえわかれば、WARPの各種APIを使用して、いろいろなストアアプリが作成できると思います。是非Microsoft "Project Siena"を使って気軽にストアアプリを作成して楽しんでください。
参考資料
http://channel9.msdn.com/Blogs/Microsoft-Project-Siena
http://download.microsoft.com/download/5/8/B/58B2E747-8BB2-4539-BD89-ABE473249DB3/391_WinRT_ProjectSienaAppsDevelopment_v1_20.pdf
http://social.technet.microsoft.com/wiki/contents/articles/23838.project-siena-creating-a-wadl-configuration-file.aspx
http://en.wikipedia.org/wiki/Web_Application_Description_Language
http://msdn.microsoft.com/en-us/library/dn743662%28v=vs.111%29.aspx