続 フローサービス管理コンソールAPIとMicrosoft "Project Siena"

今回は、開発時に壁にぶち当たりそうなところ、というか当たった所を4つ、説明します。

  1. 「フローサービス管理コンソールAPI」のData Sourcesへの追加
  2. RESTの通信環境
  3. テキストを書く
  4. IF文

「フローサービス管理コンソールAPI」のData Sourcesへの追加

これが一番重要な部分です。以下の手順になります。
画面上部で、AppData>Data Sources を選択します。

datasource.pngのサムネイル画像

画面右上の+ボタンから、RESTを選択します。

rest.png

タブから「Import a configuration file」を選択します。

inportconfig.png

接続用の設定ファイルを指定すると・・・

datasourceauth.pngのサムネイル画像

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つのパラメーターがあるのが確認できます。

datasourcelog.pngのサムネイル画像

こ れで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

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています

他のキーワードで検索する