「センサー情報取得のための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」にアクセスします。






