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