「センサー情報取得のためのRestfulなインタフェース」でRestfulなインタフェースについて考え方を記述しましたが、今回はLaravelを使って実際に実装してみました。
Laravelで作るRESTを準拠したコントローラの作成
RESTに準拠したコントローラを、次のartisanコマンドを使ってを生成します。
php artisan make:controller RestappController --resource
作成したコントローラ「WeatherControl」を次に示します。「AVR-IoT WA開発ボードによる環境センサー情報のアップロード」で作成した環境センサー「BME280」からのデータを受け取れるように、次の追加を行いました。
- 6行目は、Eloquentモデル「Senser」の定義で、「Laravel5.3による環境センサー「BME280」の情報保存」に従ってデータベーステーブル「sensers」を作成しました。
- 16行目の関数「index」でデータベーステーブル「sensers」の内容をjson形式で表示し、39行目の関数「store」でAVR-IoT WA開発ボードからの環境センサー情報をデータベーステーブル「sensers」に登録します。
WeatherController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Senser; use Log; class WeatherController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $items = Senser::all(); return $items->toArray(); // } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { // } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { Log::debug('WeatherController store'); var_dump($request->input()); $senser = new Senser; $senser->pressure = $request->Pressure; $senser->temperature = $request->Temperature; $senser->humidity = $request->Humidity; $senser->save(); $headers = [ 'Access-Control-Allow-Origin' => ' *', ]; $response["status"] = "OK"; return \Response::json($response, '200', $headers); } /** * Display the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function show($id) { // } /** * Show the form for editing the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { // } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { // } /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { // } }
ルーティング
次のルーティングの処理をweb.phpに追加します。
Route::resource('/','WeatherController');
次のコマンドで作成したルーティングを確認します。
>php artisan route:list +--------+-----------+----------------------------------------------------+------------------------------------+------------------------------------------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+-----------+----------------------------------------------------+------------------------------------+------------------------------------------------------------------------------+--------------+ | | GET|HEAD | / | index | App\Http\Controllers\WeatherController@index | web | | | POST | / | store | App\Http\Controllers\WeatherController@store | web | | | GET|HEAD | {} | show | App\Http\Controllers\WeatherController@show | web | | | PUT|PATCH | {} | update | App\Http\Controllers\WeatherController@update | web | | | DELETE | {} | destroy | App\Http\Controllers\WeatherController@destroy | web | | | GET|HEAD | {}/edit | edit | App\Http\Controllers\WeatherController@edit | web | +--------+-----------+----------------------------------------------------+------------------------------------+------------------------------------------------------------------------------+--------------+
「Advanced REST client」による動作確認
「Advanced REST client」に移動して「アプリを起動」ボタンをクリックします。「Advanced REST client」で次ように設定して、データベーステーブルに環境センサー情報を登録します。
データベーステーブルを確認すると次のようになっています。
「Advanced REST client」で次ように設定して、登録した環境センサー情報を表示します。
発生したHTTPエラー
発生したHTTPエラーを次に示します。
301 Moved Permanently
「301 Moved Permanently」が発生しました。「Request URL」の「http://localhost/webservice/weather」を「weather/」に変更するとエラーが発生しなくなりました。
419 unknown status
「419 unknown status」が発生しました。このエラーは、CSRFトークンが設定されていないことによるエラーで、「Laravel5.3による環境センサー「BME280」の情報取得」に示すように、「app/Http/Karnel.php」内の「App\Http\Middleware\VerifyCsrfToken」の行をコメントにし、CSRFトークンのチェックをOFFにします。
環境センサー情報の登録と表示
AVR-IoT WA開発ボードからアップロードされた環境センサー情報を確認するために、データベーステーブルの内容を表示します。なお、AVR-IoT WA開発ボード上のプログラムは、対応するURL「http://localhost/webservice/weather」にアクセスするように変更します。
データテーブルに登録されたデータの内容を確認するために、ブラウザで「http://localhost/webservice/weather」にアクセスします。