CakePHP5入門【WebAPI編⑯】当選番号検索
A子
それが過去何回出現しているか…とか
直前の出現がいつだったか…なんて調べたいときがあるよね?
C菜
尾行してるんじゃないか?…って相手から疑われるくらいの時間、ずっと後ろを走ってるときもありますし~(笑)
B美
A子
いや、WebAPIにしたいってことだから…(苦笑)
C菜
B美
(年月日で検索する「getYmd1」メソッドや「getYmd2」メソッドだって、そうだったじゃない)
あ、ただし、(フォームからの)POST送信はやめておいたほうが良いかも…
(やるならGETパラメータとして渡す方法ね)
C菜
B美
GETだったら、それは不要ってわけ
A子
それ(トークン送信)ってこれまでのPOST送信でもやってたの?
(全然記憶に無いんだけど…)
B美
これまで作ったWebアプリのフォーム画面上で右クリックしてから「ページのソース表示」ってやってみれば分かるわよ
(ブラウザが「Microsoft Edge」の場合)
A子
聞いたことが無いんだけど…
C菜
B美
「Cross-Site Request Forgeries」とは、ログインした正規ユーザがそのサイト(A)にアクセスする際、悪意ある別サイト(B)からの攻撃によってログインサイト(A)を不正操作されちゃうって攻撃手法の一つなの
A子
それって、悪意ある人がハッカーみたいに攻撃してくるってことなの?
B美
悪意あるサイト(B)はあらかじめ罠として仕掛けておくの
サイト(A)にログインしたユーザが(ログイン状態を維持したまま)罠サイト(B)にアクセスすると、サイト(A)が不正操作されてしまうって仕組みね
C菜
B美
んで、CakePHPのビューファイルでは、POST送信において(CSRF対策として)隠しパラメータをフォームに(勝手に)埋め込んでいるの
そのパラメータの値が正しければOKで、間違っていればNGって仕組みね
A子
だったら、WebAPIを使う人がそのあたりを用意するのは現実的じゃないね
分かった
GET送信でいこう
C菜
B美
「メソッド名/パラメータ」という形で渡して、メソッド側で引数として受け取るやり方は、すでに「getYmd1」メソッドや「getYmd2」メソッドで実装したからね
今回は別のやり方でやってみましょう
A子
|
if ($this->request->is('post')) {
$textfield = $this->request->getData('textfield'); } |
…って感じかな?
(「textfield」はフォーム部品の名前ね)
C菜
B美
「POST」では「getData」メソッドを使うんだけど、「GET」では「getQuery」メソッドになるの
A子
|
if ($this->request->is('get')) {
$textfield = $this->request->getQuery('textfield'); } |
…ってこと?
B美
C菜
|
//ナンバーズ3の当選番号検索
public function num3Search() { if ($this->request->is('get')) { $number = $this->request->getQuery('number'); $search_result = $this->Numbers->find()->where(['num3_str' => $number])->toArray(); $status = [ 'code' => 200, 'message' => 'Success' ]; $result = $search_result; //JSON化する前の連想配列 $json = [ 'status' => $status, 'result' => $result ]; //JSONエンコードした結果を返す $this->autoRender = false; header("Content-Type: application/json"); echo json_encode($json); } } |
B美
大枠としては十分ね
あとは細かいエラーチェックが必要よ
(検索結果が空のときとか…)
A子
|
1.空文字列が送信されたとき
2.3けたの数字以外が送信されたとき 3.結果が空だったとき |
なんかが思いついたエラーだね
C菜
|
//ナンバーズ3の当選番号検索
public function num3Search() { $error_code = 0; if ($this->request->is('get')) { $number = $this->request->getQuery('number'); //numberが無い場合はエラー if ($number === null) { $error_code = 1; } //3桁の数字でなければエラー if ($error_code == 0) { if (!preg_match('/^\d{3}$/', $number)) { $error_code = 2; } } if ($error_code == 0) { $search_result = $this->Numbers->find()->where(['num3_str' => $number])->toArray(); if (empty($search_result)) { //結果が空ならエラー $error_code = 3; } } if ($error_code == 1) { //NG1 $status = [ 'code' => 601, 'message' => 'No Parameter' ]; $result = null; } elseif ($error_code == 2) { //NG2 $status = [ 'code' => 602, 'message' => 'Numeric Check NG' ]; $result = null; } elseif ($error_code == 3) { //NG3 $status = [ 'code' => 404, 'message' => 'Not Found' ]; $result = null; } else { //OK $status = [ 'code' => 200, 'message' => 'Success' ]; $result = $search_result; } //JSON化する前の連想配列 $json = [ 'status' => $status, 'result' => $result ]; //JSONエンコードした結果を返す $this->autoRender = false; header("Content-Type: application/json"); echo json_encode($json); } } |
エラー時のステータスコードですけど、勝手に600番台を作りましたよ~
(この世に存在しないコード番号ですけど~)
B美
API仕様書に明記しておけば良いだけだから…
A子
てか、ChatGPT先生に教えてもらった通りなんだけど…(苦笑)
(意味不明な個所が多々有り(笑))
C菜
| http://192.168.1.205/apitest05.html |
↓(「123」を検索)
A子
ばっちりじゃん
B美
結果として「実施回」「抽選日」「曜日」「六曜」のみを取得できれば良いのなら、データベース検索時に射影すべきね
|
$search_result = $this->Numbers->find()
->select(['lottery_time', 'lottery_date_str', 'lottery_week_str1', 'lottery_week_str2', 'lottery_rokuyo_str']) ->where(['num3_str' => $number]) ->toArray(); |
あ、「lottery_week_str2」は不要かもしれないけど、念のため…
C菜
それでは、ついでに「ナンバーズ4」のための「num4Search」メソッドと、「apitest06.html」も作っておきましょう~
「num3Search」メソッドと「apitest05.html」の内容とほとんど同じなので、コードは省略するです~
実行結果だけを表示しておきますね~
| http://192.168.1.205/apitest06.html |
↓(「1234」を検索)
A子
完璧じゃん
B美
それが完成次第、私のほうで本番環境(VPSサーバ)への設置をやっておくわね
C菜
B美部長も色々と大変ですね~
お疲れ様です~
(主に、A子社長の無茶ぶりに対処するという意味で…(苦笑))
A子
このアプリのバージョンを「1.0.0」にしよう
(そろそろリリース版にしても良いんじゃない?)
B美
C菜
A子
そのジト目は…


