この記事は普段PPTとExcelの仕事ばかりでプログラムを書けないSIerのなんちゃってエンジニア「うらー」が、本とネットの情報を駆使してRESTful なAPIとswiftでiPhone向けのクーポン配信サービスを開発した記録です。開発を始めたきっかけから、APIとアプリの仕様、具体的な手順まで公開しています。
開発を始めたきっかけ
一番の理由は自分の立場に罪悪感を感じた事。自分はアジャイル開発が専門分野ですが導入コンサル的なポジションなので実装に関わる機会がすごく減っています。にも関わらず立場上「こう設計すべき」「こう実装すべき」と言わなければならず、だんだん教える立場の自分が未経験の事を開発者に「やれ」という機会が増え、罪悪感を感じるようになりました。やった事も無い人間に偉そうに「やれ」と言われたら嫌ですよね。その時に関わっていた案件がpythonでRestAPIを開発していたので、自分でも一通り実装できるようになっておこうと思いました。
二つ目の理由は自分の立場に危機感を感じた事。前述の通りアジャイル開発のコンサル的な役割で実装を担当する事はありません(というか担当させてもらえない)。これはSIerならではです。ユーザ系企業だとアジャイルを知っている開発者が開発しながら周りに教えたり、全社のエバンジェリストを兼務するケースが普通だと思います。すると自分はアジャイルに取組んでいるSIerでしか必要ないニッチな人材という事になります。もし会社がアジャイルの取組みを止めたりアジャイルが一般に定着してコンサル的な役割が必要なくなった時、悲しい事になります。なので実装も分かるようにしておかないとヤバいと思いました。
クーポン配信サービスについて
居酒屋のクーポンを配信するAPIと、APIから取得したクーポン情報をiPhoneに表示するアプリを作ります。APIはpythonで開発してクラウドで公開できるところまで作ります。アプリはswiftで開発します。それぞれの機能とシステム構成を簡単に説明します。
APIの機能
- APIはクーポンのタイトル、割引特典、説明、利用可能店舗、利用可能期間、クーポンの画像などを配信する
- APIはリクエストパラメータを指定する事でレスポンスする情報のフィルタができる
- APIはトークン認証によってクーポン情報を新規投稿、変更、削除できる
- レスポンスはJson
クーポンデータのイメージ

APIのシステム構成
クラウドで公開する際の最終形は下記の構成になります。

アプリの機能
- アプリはAPIで取得した1つ以上のクーポン情報を画面に表示する
アプリのイメージ

開発の手順
調べて試しながらの開発でしたので、かなり回り道な手順となっています。自分のPC(Mac)に開発環境を作るところからスタートします。各作業ごとの細かい手順 はQiitaに投稿しているので、そちらを参考に進めて頂くとご自身の環境でも同じようなアプリを作る事が出来ると思います。
手順に加えて開発したコードをGitHubで公開しています。リンクを手順の後ろに貼っておきます。
APIを開発をするための準備をする
no. | 作業 | 手順メモ |
---|---|---|
1 | Pythonを開発マシンにインストール(アップデート) | MacのPythonを2系から3系にアップデートする |
2 | エディターをインストール ※自分はVSCodeを選びました | |
3 | Pythonで簡単なプログラムを書いて動かしてみる | Pythonのプログラムをとりあえず書いて動かしてみる |
4 | Djangoのインストール | pipenvの仮想環境にDjangoをインストールする |
5 | Djangoの環境でpythonのプログラムを動かしてみる | pipenvで作ったDjangoの環境でpythonを動かしてみる |
VSCodeでpythonを書く場合はpython用の拡張機能のインストールをお薦めします。手順は下記の通り
VSCodeの左のメニューのExtensionsを開いて、検索ボックス(Search Extensions in Marketplace)にPython と入力。Python用の拡張機能を検索します。Pythonに関連する拡張機能の一覧が表示されます。

リストから、Python を選択して、緑色のインストールボタンを押してインストールします。
とりあえずJSONでレスポンスするAPIを作ってみる
.no | 作業 | 手順メモ |
---|---|---|
6 | 簡単なAPIを作ってみる | (初心者向け)DjangoでシンプルなwebAPIを作ってみる |
7 | Djangoのテンプレート機能を使ってみる ※これはAPIを作る目的からすると不要だが、勉強として実施した。 | Djangoのテンプレート機能を使ってみる |
8 | gitでコードを管理する方法を覚える | (初心者向け)コードをgitで管理する方法 gitのインストールから〜 |
9 | 6で作ったAPIをJSON形式でレスポンスするように改造する | 【Python/Django】JSON形式でレスポンスをするwebAPIを作成する |
クーポンを表示する必要最小限のiPhoneアプリを開発する
no. | 作業 | 手順メモ |
---|---|---|
10 | APIで取得したクーポンの情報をアプリが取り出せるようにする | swiftでwebAPIを呼び出してjsonデータを表示させる |
11 | 取り出したクーポンの情報の中から必要最低限の情報を画面に表示出来るようにする | APIで取得したデータをswiftのTableViewに表示する |
データベースで管理されたクーポン情報を配信できるようにする
ここまでで作成したAPIはクーポンの情報をコードに直接書いていましたが、クーポンの情報を追加したり編集したり削除するのに都度コードに手を加えなくてはならず実用的ではありません。データベースで管理できるように改修します。
no. | 作業 | 手順メモ |
---|---|---|
12 | Djangoの機能を使ってクーポンの情報をデータベースで管理できるように改造する。 | DBに格納したデータを返すwebAPIをDjangoとSQLiteで開発する |
iPhoneアプリのアップデート
12の改修でAPIがレスポンスする情報とJSONのかたちが変わったのでアプリ側を対応させます。加えてクーポンの説明や対象店舗などの情報も表示できるようにします。
no. | 作業 | 手順メモ |
---|---|---|
13 | 改修後のAPIがレスポンスするJSONからデータを取得できるようにアプリを修正する | swiftで配列型のJSONから値を取り出す |
14 | クーポンの説明や対象店舗などの情報も表示できるように、一覧表示のデザインを変更する | SwiftのTableViewCellを使ってTableViewを自由にカスタマイズ |
RestFullなAPIに改造する
ここから今回の本命のRest形式のAPIになるよう改造します。DjangoはDjango Rest Framework というフレームワークを導入することで簡単にRestFullなAPIが開発できます。Rest化させた上で、クーポン情報のフィルタリングや認証など、実運用で想定される機能も実装します。
no. | 作業 | 手順メモ |
---|---|---|
15 | Django Rest Frameworkを導入してAPIをRest化する | Django Rest Framework で RESTful な APIを作成する |
16 | Django Filterを導入して、リクエストで指定されたデータと一致するクーポンのみレスポンスできるようにする。 | Django Rest Framework で 特定のデータだけレスポンスするようにフィルタを設定する |
17 | リクエストで指定された日付よりも有効期限が後のクーポンのみレスポンスできるようにオリジナルのフィルタを作る | 【Django Rest Framework】Django-Filterを使ってフィルタ機能をカスタマイズする |
18 | POST,PUT,DELETEのリクエストに対してトークン認証を設定し、データを守る。 | Django Rest Framework で JWTによるAPIの認証機能を実装 |
19 | クーポンの画像を配信できるようにする | Djangoで画像を配信できるwebAPIを作る |
クーポンの画像をアプリに表示できるようにする
no. | 作業 | 手順メモ |
---|---|---|
20 | APIで取得したクーポンの画像をiPhoneのアプリで表示できるようにする。 | 【Swift】TableViewCellにImageViewを追加してURLで指定された画像を表示する |
パブリッククラウドでAPIを公開する
no. | 作業 | 手順メモ |
---|---|---|
21 | クラウドにAPIを公開するための環境を構築する | AWS Amazon Linux2 で Django 2.2以降の環境を構築する |
22 | クラウドの環境にAPIをデプロイする | nginx、uWSGI、Djangoの構成でEC2にアプリケーションをデプロイする |
以上でAPIとアプリは一旦完成という事にしました。次は作ったサービスを居酒屋の店長に見せて感想をもらおうと思っていますが、新型コロナの関係で店が休業中のため、5月以降になりそうです。
今回の開発をきっかけにAPIとアプリを組み合わせたサービスの作り方が多少理解できたので、引き続きもっと面白いものを作りつつ未経験の技術にもチャレンジしていこうと思います。
最後に、開発したコードはGitHubで入手いただけます。