LaravelでRESTを作った(その2)
2017年3月13日
昨日作った、REST APIに更新と削除も作って、C#からアクセスしてみる。
テーブルにidの列がないとうまく動かないらしいので追加した。
unsigned intでAUTO_INCREMENTで主キーに設定した。
– 手順 –
1.モデルの修正
$fillableを追加した。
これ入れないと、updateOrCreateとかエラーになるので。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Blood extends Model { protected $table = 'pressure'; public $timestamps = false; protected $fillable = array('date','wakeup','time','max','min','pulse','ck','memo','weight'); } |
2.apiの修正
追加と削除のapiを追加する
1 2 3 |
Route::get('blood/{from}/{to}', 'BloodController@show'); Route::put('blood', 'BloodController@update'); Route::delete('blood/{date}/{time}', 'BloodController@destroy'); |
削除は、
http://192.168.0.135/api/blood/日付/時間
の形にしてみた。
例)http://192.168.0.135/api/blood/2017-03-01/12:00:00
3.コントローラーの修正
updateとdeleteメソッドを作成する。
updateはレコードがなければ、追加するようにした。
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 35 36 37 38 39 40 41 42 43 44 45 46 |
/** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function update(Request $request) { if (0 === strpos($request->headers->get('Content-Type'), 'application/json')) { $data = json_decode($request->getContent(), true); $request->request->replace(is_array($data) ? $data : array()); if (!array_key_exists('date', $data[0]) || !array_key_exists('time', $data[0])) { return response()->json(array('status' => 'BAD-REQUEST'), 400); } $bloods = Blood::updateOrCreate( ['date' => $data[0]['date'], 'time' => $data[0]['time']], ['wakeup' => $data[0]['wakeup'], 'max' => $data[0]['max'], 'min' => $data[0]['min'], 'pulse' => $data[0]['pulse'], 'ck' => $data[0]['ck'], 'memo' => $data[0]['memo'], 'weight' => $data[0]['weight']] ); return response()->json($bloods, 200); } else { return response()->json(array('status' => 'BAD-REQUEST'), 400); } } /** * Remove the specified resource from storage. * * @param string $date * @param string $time * @return \Illuminate\Http\Response */ public function destroy($date, $time) { $res = Blood::where('date', $date)->where('time', $time)->forceDelete(); return response()->json($res, 200); } |
4.テストしてみる
FireFoxのプラグインHttpRequesterでPUTとDELETEを投げてみる。
動いた。(o^-‘)b グッ!
5.C#でアクセスする
①追加と削除のメソッドを追加
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
public bool Update(BloodModel model) { bool res = false; try { string url = string.Format("http://192.168.0.135/api/blood/"); WebRequest request = WebRequest.Create(url); request.Method = "PUT"; request.ContentType = "application/json"; using (var streamWriter = new StreamWriter(request.GetRequestStream())) { string json = JsonConvert.SerializeObject(new List<BloodModel>() { model }); streamWriter.Write(json); } var httpResponse = (HttpWebResponse)request.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var responseText = streamReader.ReadToEnd(); Debug.WriteLine(responseText); } res = true; } catch (Exception e) { Debug.WriteLine(e.Message); } return res; } public bool Delete(BloodModel model) { bool res = false; try { string url = string.Format("http://192.168.0.135/api/blood/{0}/{1}", model.Date.ToString("yyyy-MM-dd"), model.Time); WebRequest request = WebRequest.Create(url); request.Method = "DELETE"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); var httpResponse = (HttpWebResponse)request.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var responseText = streamReader.ReadToEnd(); Debug.WriteLine(responseText); } res = true; } catch(Exception e) { Debug.WriteLine(e.Message); } return res; } |
②実行
完成。(∩´∀`)∩
—
このままでは、ローカルでしか使えないので、認証を入れたいな。。。