UnityからFuelPHPで作成したWebAPIにアクセス

#概要
Unityからサーバー上にある、FuelPHPで作ったWebAPIにアクセスする方法。
ApacheやPHPやMySQLのインストールや設定や起動の仕方は省略しているので、その辺の知識があってなおかつUnityの基本操作が分かる人向けです。
MySQLのユーザ、パスワードともに rootと仮定して説明しています。

#参考文献
・#FuelPHP 5 分で API を実装するチュートリアル（スクリーンキャストあり）
http://blog.omoon.org/20131219/925
・[Unity][MiniJSON]JSONデータを読み込む
http://www.cho-design-lab.com/2013/08/15/unity-minijson-load-json/
##試行環境
**サーバー側**
OS:Amazon Linux AMI release 2014.09
Apache:2.4.10 
PHP:5.4.33 
MySQL:5.5.40 
FuelPHP:1.7.2
- - -
**クライアント側**
OS:Windows 8.1
Unity:4.5.5f1


#サーバー側
上にに載せている参考文献の#FuelPHP 5 分で API を実装するチュートリアル（スクリーンキャストあり）をほとんどそのまま使わせていただきます…すこし変えていますが、参考文献の方を覗いたほうがわかりやすいと思います。

###DBの用意

```
$ echo 'create database fuel_dev' | mysql -u root -proot
```
（FuelPHP インストール時にデフォルトでdevelopment環境でのデフォルトのDBの名前がfuel_dev）

###FuelPHPのインストール

```
$ curl get.fuelphp.com/oil | sh
$ cd /var/www/html #ドキュメントルートへ
$ oil create api
```
ビルトインサーバは使いません。
http://（各自のサーバーのアドレス）/api/publicにアクセスし以下のようなページが出たらインストール完了
![FuelPHP Framework.png](https://qiita-image-store.s3.amazonaws.com/0/49904/d1586411-8682-c963-8645-51092a771312.png)

##DBの設定
DBの接続のための設定をします。仮定通りなら読み飛ばしてください。

```PHP:api/fuel/app/config/development/db.php
<?php
/**
 * The development database settings. These get merged with the global settings.
 */

return array(
	'default' => array(
		'connection'  => array(
			'dsn'        => 'mysql:host=localhost;dbname=fuel_dev',//自分の環境に合わせて変更
			'username'   => 'root',//自分の環境に合わせて変更
			'password'   => 'root',//自分の環境に合わせて変更
		),
	),
);
```

##何を作るか

簡単なメモみたいなのを作ります。

http://(各自のサーバーのアドレス)/api/public/memo/write (POST メソッドで)
http://(各自のサーバーのアドレス)/api/public/memo/read (GET メソッドで、JSONを返す)
という２つの URL を用意して、それぞれ、メモの投稿と取得をさせる。

##oil generate で model 作成

```
$ oil generate model memo memo:varchar created_at:timestamp updated_at:timestamp --mysql-timestamp --crud --created-at --updated-at

 Creating model: /Users/omoon/Documents/api/fuel/app/classes/model/memo.php
    Creating migration: /Users/omoon/Documents/api/fuel/app/migrations/001_create_memos.php
```

となって、model と同時にマイグレーションファイルも作成されている。

そのまま oil r migrate して、テーブルを作成する。

```
$oil r migrate
Performed migrations for app:default:
001_create_memos
```

ここでエラーが出るならDBの接続に失敗しているので、DBの設定を参考に間違えてないか確認

##ルーティングの設定
```PHP:fuel/app/config/route.php
//(省略)
    'memo/read' => 'memo/read',
    'memo/write' => 'memo/write',
);
```
上記の2行を追加。

##oil generate で controller 作成

```
$ oil generate controller memo write read --extends=Controller_Rest
```

でViewとControllerが自動生成される。
自動生成されたコントローラを以下のように変更

```PHP:fuel/app/classes/controller/memo.php
<?php
class Controller_Memo extends Controller_Rest
{

    protected $format = 'json';

    public function get_read()
    {
        $memos = Model_Memo::find_all();
        $this->response($memos);
    }

    public function post_write()
    {
        $memo = Input::post('memo');
        Model_Memo::forge(['memo' => $memo])->save();
    }

}
```

###動作確認

```
$ curl http://(各自のサーバーのアドレス)/api/public/memo/write -d "memo=test1"
$ curl http://(各自のサーバーのアドレス)/api/public/memo/write -d "memo=test2"
$ curl http://(各自のサーバーのアドレス)/api/public/memo/write -d "memo=test3"
```

http://(各自のサーバーのアドレス)/api/public/memo/readにアクセスして以下の様なJSONを出力していたら成功

```
[{"id":"1","memo":"test1","created_at":"2014-10-27 13:27:56","updated_at":"2014-10-27 13:27:56"},{"id":"2","memo":"test2","created_at":"2014-10-27 13:28:03","updated_at":"2014-10-27 13:28:03"},{"id":"3","memo":"test3","created_at":"2014-10-27 05:45:01","updated_at":"2014-10-27 13:28:06"}]
```

これでサーバー側の方は終わりです。

#クライアント側
##miniJSONの利用準備
わかりにくかったら参考文献の[Unity][MiniJSON]JSONデータを読み込むを参照してください。
https://gist.github.com/darktable/1411710
1.上記のページの「Download Gist」ボタンを押し、圧縮ファイルをダウンロードし、ファイルを解凍、ディレクトリ中の「MiniJSON.cs」を取り出します。

2.UnityのProjectウインドウのAsset内に「Plugins」というディレクトリを作成し、このディレクトリにMiniJSON.csをコピーする。
これで使えるはずです。

##実際にスクリプトを書いて書き込み読み出しを行ってみる
スクリプトを作成する

```csharp:ReadWriteJSON.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using MiniJSON;

public class ReadWriteJSON : MonoBehaviour {

	// Use this for initialization
	void Start () {

		StartCoroutine ("ReadMemo");
	}

	IEnumerator WriteMemo(){
		string url1 = "http://(各自のサーバーのアドレス)/api/public/memo/write";
		WWWForm wwwForm = new WWWForm();
		//指定urlにデータを送信
		wwwForm.AddField( "memo", "test4" );

		WWW gettext = new WWW(url1,wwwForm);
		yield return gettext;


	}


	IEnumerator ReadMemo(){
		//WriteMemoを実行し終わるまで待つ
		yield return StartCoroutine ("WriteMemo");

		//URLからデータを取得
		WWW www = new WWW("http://(各自のサーバーのアドレス)/api/public/memo/read");
		yield return www;

		//Null or empty ならブレイク
		if(!string.IsNullOrEmpty(www.error)){
			Debug.LogError(string.Format("Fail Whale!\n{0}", www.error));
			yield break;
		}
		//データを代入し整形
		string json = www.text;
		IList memo = (IList)Json.Deserialize(json);

		//テスト用にコンソールに書き出し
		foreach(IDictionary memos in memo){
			Debug.Log((string)memos["memo"]);
		}
	}
}
```

Create EmptyでGameObjectを作成し、先ほど作ったスクリプトをドラッグオンドロップして実行し以下の様にconsoleに出力されたら成功
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/49904/312fa886-3807-18e0-da01-9f90a27fe404.png)