LaravelでRESTを作った
昨日入れたLaravelでREST APIを作った。
httpリクエストでDBからjsonでデータを取得して、C#で使うってことをやってみる。
マシン構成は、
まだテストなので、DBとRESTは別マシン。
血圧管理手帳システムのDBで、テーブルはこんな感じ。
データは日々の血圧とか体重とか。。体重データーはシークレット。(ゝω・)
– 手順 –
1.LaravelにDB設定する。
/var/www/blood/の下に、Laravelのプロジェクトを作ってある。
※ 前回参照
①/var/www/blood/.envのDB設定を修正。
※この設定はいらないかもしれない?
1 2 3 4 5 6 |
DB_CONNECTION=mysql DB_HOST=192.168.0.132 DB_PORT=3306 DB_DATABASE=blood DB_USERNAME=xxxxx DB_PASSWORD=xxxxx |
②/var/www/blood/config/database.phpの修正
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
default' => env('DB_CONNECTION', 'mysql'), 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '192.168.0.132'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'blood'), 'username' => env('DB_USERNAME', 'xxxxx'), 'password' => env('DB_PASSWORD', 'xxxxx'), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], |
元のソースは、
9 10 |
'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', |
ってなっていたけど接続先のMySQLが古いとエラーが出るのでmb4を消した。
2.コントローラーの作成
1 2 |
# cd /var/www/blood/ # php artisan make:controller BloodController --resource |
/var/www/blood/app/Http/Controllers/にコントローラーが作成される。
3.モデルの作成
①作成
1 2 |
# cd /var/www/blood/ # php artisan make:model Blood -m |
以下が作成される
/var/www/blood/appにモデルファイル
/var/www/blood/database/migrationsにマイグレーションファイル
/var/www/blood/database/seedsにシードファイル
②モデルの修正
テーブル名を追加する。
1 2 3 4 5 6 7 8 9 10 11 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Blood extends Model { protected $table = 'pressure'; public $timestamps = false; } |
4.api.phpの修正
今回のapiを追加する。
1 |
Route::get('blood/{from}/{to}', 'BloodController@show'); |
とりあえず、showだけ作る。
リクエストURLは、血圧データを日付範囲で指定する形にした。
http://192.168.0.135/api/blood/開始/終了
例) http://192.168.0.135/api/blood/2017-03-01/2017-03-11
5.コントローラーの修正
showメソッドの引数を2つに変更して、中身を実装。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php namespace App\Http\Controllers; use App\Blood; use Illuminate\Http\Request; class BloodController extends Controller { /** * Display the specified resource. * * @param string $from * @param string $to * @return \Illuminate\Http\Response */ public function show($from, $to) { // データ取得 $bloods = Blood::whereBetween('date', array($from,$to))->orderBy('date', 'asc')->get(); if ($bloods->isEmpty()) { // データが空ならエラーを返す return response()->json(array('status' => 'NOT-FOUND'), 404); } else { // データがある場合はjson形式でレスポンスする return response()->json($bloods); } } |
URLにアクセスしてみる。
http://192.168.0.135/api/blood/2017-03-01/2017-03-11
jsonが返ってきた。(o^-‘)b グッ!
6.C#でアクセスする
①json.netを入れる
プロジェクトを作成したら、Visual StudioのツールからNuGetで入れる。
Newtonsoft.Jsonを入れた。
②WebClientを使うので参照に追加する
System.Net.Http
System.Net.Http.WebRequest
等を追加
③モデルを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using Newtonsoft.Json; public class BloodModel { [JsonProperty(PropertyName = "date")] public DateTime Date { get; set; } [JsonProperty(PropertyName = "wakeup")] public bool Wakeup { get; set; } [JsonProperty(PropertyName = "time")] public TimeSpan Time { get; set; } [JsonProperty(PropertyName = "max")] public int Max { get; set; } [JsonProperty(PropertyName = "min")] public int Min { get; set; } [JsonProperty(PropertyName = "pulse")] public int Pulse { get; set; } [JsonProperty(PropertyName = "ck")] public bool Check { get; set; } [JsonProperty(PropertyName = "memo")] public string Memo { get; set; } [JsonProperty(PropertyName = "weight")] public Decimal Weight { get; set; } } |
④データ取得コードを書く
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public class DBManager { private static DBManager _DBManager = null; private DBManager() { } public static DBManager GetInstance() { if (_DBManager == null) _DBManager = new DBManager(); return _DBManager; } public IList<BloodModel> Read(DateTime from, DateTime to) { IList<BloodModel> model; // URL string url = string.Format("http://192.168.0.135/api/blood/{0}/{1}", from.ToString("yyyy-MM-dd"), to.ToString("yyyy-MM-dd")); using (WebClient wc = new WebClient()) { var json = wc.DownloadString(url); model = JsonConvert.DeserializeObject<IList<BloodModel>>(json); } return model; } } |
var data = DBManager.GetInstance().Read(fromDate, toDate);
みたいな感じで、データ取得する。
⑤実行
できた。(∩´∀`)∩
—
血圧管理手帳システムはExcelのリボンアプリなので、実際はこうなった。
しかし、デバッガでは動くんだが、vstoをインストールして実行するとエラーになる。(´ヘ`;) う~ん・・・
Visual Studio 2017で何か変わったのかな?参照してるアセンブリが違うのだろうか?
Microsoft.Office.Interop.Excelが7個もあるし。。。(´ヘ`;) う~ん・・・
とりあえずREST取得はできたので、つぎは更新系をやってみよう。。
iPhoneで日々のデータを入力するみたいなのがいいな。。