スマホ×Windows Azure開発講座(iOS編)

第3回iOS上にRESTサービスの構築

はじめに

前回まではiOSデバイス+Windows Azureプラットフォームの開発における、技術概要と開発環境の構築についてご紹介しました。今回から、実際にAzureサービスとiOSアプリケーションとの開発を始めていきたいと思います。今回はWebロール上で動作させるサービスの開発を行いたいと思います。

Windows Azureのサービス開発における環境構築については、第2回の記事を参考にして、行ってください。本記事では、Visual Studio 2010を使用して開発内容を説明していきます。第2回で紹介したとおり、Visual Web Developer 2010 Expressでも開発可能です。以降、Visual Studioと表記しますので、適宜環境に合わせて読み替えてください。

作成するサービスの概要

今回の例として作成するのは、ユーザが星座を指定してカードを引くという、星座占いもどきのサービスです。サービスを呼び出すと、ランダムにカードを返すメソッドを実装します。iOSデバイスから扱いやすいように、エンティティはJSONで、インターフェースはRESTにします。

プロジェクトのセットアップ

今回作成するサービスは、Windows AzureのWebロールをターゲットとします。開発はWindows Azureエミュレーション環境で行います(第2回の環境構築にこちらも含まれています⁠⁠。

Visual Studioを(Vista以降では管理者権限で)起動したらテンプレートからプロジェクトを生成します。メニューの「ファイル(F)」「新しいプロジェクト…(P)」でダイアログが開きます。左のリストから「インストールされたテンプレート」「Visual C#」を展開して、⁠Cloud」を選択します。中央リストに表示された「Windows Azure Project」を選んで、プロジェクト名を名前のテキストボックスに入力します。ここでは「GihyoiOSAzureSample1」とします。⁠OK]ボタンをクリックすると、次に[New Windows Azure Project]ダイアログが開きます。左のリストから「WCF Service Web Role」を選択して、⁠>]ボタンで追加して、⁠OK]ボタンでプロジェクトが生成されます図1⁠。

図1 Webロールの選択
図1 Webロールの選択

ソリューションにAzureプロジェクトの「GihyoiOSAzureSample1」「WCFServiceWebRole1」があります。後者のプロジェクトの名を変更しておきます。今回は占いをモチーフにしたサービスを作るので、⁠DivinationWebRole」としましょう。さらに、このプロジェクトの項目の直下に、⁠Service」「Entity」フォルダを作成しておきます。いずれの操作も「ソリューションエクスプローラー」で、プロジェクトの項目のコンテキストメニュー経由で実行できます。プロジェクト名を変更したら、続けてプロジェクトのプロパティから、⁠アセンブリ名][既定の名前空間]も同様に「DivinationWebRole」に変えておきます。

エンティティの追加

JSONで表現する⁠カード⁠のエンティティクラスを作成します。作成した「Entity」フォルダを選択してコンテキストメニューから[追加 (D)][新しい項目の追加…(W)]を選びます。⁠新しい項目の追加]ダイアログでテンプレートのWebから「クラス」を選択します。名前に「Card.cs」を入力して、⁠追加(A)]をクリックして追加します。

Card.csは下記のとおりにします。

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace DivinationWebRole.Entity
{
    [DataContract]
    public class Card
    {
        [DataMember(Name = "rank")]
        public int Rank { get; set; }

        [DataMember(Name = "desc")]
        public string Description { get; set; }
    }
}

DataContract属性をクラスに、プロパティにDataMember属性を追加します。JSONのキーになるので、Nameを小文字にしてセットしています。

サービスの作成

先ほど、作成した「Service」フォルダを選択してコンテキストメニューから[新しい項目の追加]ダイアログを開き、テンプレートのWebから「AJAX対応WCFサービス」を選択して図2⁠、サービス名を「DivineService.svc」として、⁠追加(A)]ボタンで閉じます。

そうすると自動的に、Visual Studio上で追加作成されたDivineService.svcのコードが開きます。

図2 Ajax対応WCFサービスの選択
図2 Ajax対応WCFサービスの選択

DoWorkメソッドをDivineメソッドに変えて処理を、下記のとおり実装してみます。Divineメソッドは、zodiac引数に星座を表す文字列を受け取り、それを用いて、CardクラスのDescriptionプロパティをセットします。Rankプロパティにはランダムに1~10の整数をセットします。

Using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;

namespace DivinationWebRole.Service
{
    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class DivineService
    {
        [OperationContract]
        [WebGet(UriTemplate = "card/{zodiac}",
                ResponseFormat = WebMessageFormat.Json)]
        public Entity.Card DrawCard(string zodiac)
        {
            var random = new Random();
            var card = new Entity.Card();
            card.Rank = random.Next(10) + 1;
            card.Description = "This is a sample " + zodiac + " Card.";
            return card;
        }
    }
}

WebGet属性のUriTemplate値は、REST仕様のURLパス適用を定義するものです。

UriTemplateを使用するには、Web.configのビヘイビア(behavior)定義を変更する必要があります。Web.configを開いて、<behavior name="DivinationWebRole.Service.DivineServiceAspNetAjaxBehavior">内の<enableWebScript />を<webHttp/>に置き換えます。

<behavior name="DivinationWebRole.Service.DivineServiceAspNetAjaxBehavior">
  <webHttp />
</behavior>

開発環境でのテスト実行

「DivineService.svc」のコンテキストメニューから[ブラウザーで表示(B)]でサービスが起動し、Internet Explorerが開かれます。

URLは「http://localhost:<ポート>/Service/DivineService.svc」となって、WSDLを使ったクライアントの生成の説明が表示されています図3⁠。

図3 サービスのページ
図3 サービスのページ

ここでURLパスの末尾に実装したDivineメソッドのパス「card/leo」にアクセスします。

ブラウザーで「http://localhost:<ポート>/Service/DivineService.svc/card/leo」にアクセスすると、JSONでCardクラスの内容が返ります。テキストエディタで開くと、下記のように表示されます。⁠leo」の部分はパスの値が入り、⁠7」の値はランダムになります。

{"desc":"This is a sample leo Card.","rank":7}

今回紹介したサンプルコードはこちらからダウンロードできます。

最後に

本記事では、Windows Azureサービスを一般的なWebロール用にWCFベースでC# .NETで作成してみました。次回以降は、今回作成したサービスをクラウドに配備して、 サービスにアクセスするiOSアプリケーションの開発を進めていきたいと思います。

再びのご紹介になりますが、Windows Azure プラットフォームは無料で試すことができます。MSDNサブスクリプション会員であれば、さらに相当量の利用が無償で使用できます。これを機会に試してみては、いかがでしょうか。

おすすめ記事

記事・ニュース一覧