質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

2回答

7520閲覧

FuelPHPでAPIを叩いた時のステータスコードが400番台で404エラー

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2016/04/21 08:20

編集2016/04/21 08:21

APIでユーザーIDとパスワードを検証してログインさせる機能を作っています。

APIはユーザーIDとパスワードが正しければステータスコード200を、間違えていればステータスコード400を返してきます。
200が返ってきた場合は問題なく動作するのですが、400が返ってきたときになぜか404エラーが表示されてしまします。

API単体での動作をFirefoxのアドオン「HTTP Requester」などでチェックすると、問題なく意図したとおりに動いていることを確認できます。

###ログインコントローラ

php

1class Controller_Login extends Controller 2{ 3 private $fields = [ 4 'username', 5 'password' 6 ]; 7 8 public function action_index() 9 { 10 // 既にログイン済ならダッシュボードへ 11 if (Auth::check()) 12 { 13 Response::redirect('dashboard'); 14 } 15 16 // バリデーションルール 17 $val = Validation::forge(); 18 $val->add('username','ID')->add_rule('required'); 19 $val->add('password','パスワード')->add_rule('required'); 20 21 if (Input::method() === 'POST') 22 { 23 // 入力値をセッションに保持 24 foreach ($this->fields as $field) 25 { 26 Session::set_flash($field, Input::post($field)); 27 } 28 29 // バリデーションとCSFRトークンチェック 30 if ($val->run() && Security::check_token()) 31 { 32 $id = Input::post('username'); 33 $password = Input::post('password'); 34 35 // 認証API 36 $auth = new Authentication(); 37 if ($auth->check($id, $password)) 38 { 39 $user = Model_User::findFromUsername($id); 40 41 if ($user) 42 { 43 Auth::force_login($user->id); 44 } 45 else 46 { 47 $user_id = Auth::create_user($id, Str::random('alnum', 16), Str::random('alnum', 16).'@example.com'); 48 Auth::force_login($user_id); 49 } 50 Auth::remember_me(); 51 52 Response::redirect('dashboard'); 53 } 54 55 Session::set_flash('login.error', 'IDもしくはパスワードが違います。'); 56 } 57 } 58 59 return View::forge('login', [ 60 'val' => $val, 61 ]); 62 } 63}

###APIアクセスクラス

php

1class Authentication 2{ 3 /** 4 * 認証APIへIDとパスワードを送る 5 * 6 * 認証が成功の場合true 7 * 認証が失敗の場合false 8 * を返す 9 * 10 * @param integer $id 11 * @param string $password 12 * @return boolean 13 */ 14 public function check($id, $password) 15 { 16 $curl = Request::forge(API_URL, 'curl'); 17 $curl->set_method('post'); 18 $curl->set_params([ 19 'id' => $id, 20 'password' => $password, 21 ]); 22 $curl->set_header('Content-Type', 'application/json'); 23 $curl->execute(); 24 $response = $curl->response(); 25 26 if ($response->status == 200) 27 { 28 return true; 29 } 30 31 return false; 32 } 33}

###API

php

1class Controller_Api extends Controller_Rest 2{ 3 protected $format = 'json'; 4 5 public function post_auth() 6 { 7 $request = Input::json(); 8 9 if (!($request['id'] && $request['password'])) 10 { 11 return $this->response([ 12 'message' => '失敗時メッセージ' 13 ], 400); 14 } 15 16 if ($request['id'] === '0123456789' && $request['password'] === 'password') 17 { 18 return $this->response([ 19 'message' => '成功時メッセージ' 20 ]); 21 } 22 23 return $this->response([ 24 'message' => '失敗時メッセージ' 25 ], 400); 26 } 27}

どのようにすれば404エラーを表示させずにできるでしょうか?
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Request_Curlのソースコードを確認してみたらexecuteメソッドに
関係ありそうな箇所がありました。

php

1elseif ($this->response->status >= 400) 2{ 3 $this->set_defaults(); 4 throw new \RequestStatusException($body, $this->response->status); 5}

レスポンスステータスが400以上ならRequestStatusExceptionをスローするという処理のようで
同例外の親の親がHttpNotFoundException(404)でした。
400を返しているところを503,505などに変えるとどうなりますか?
Request_Curl経由だと全部404にされてしまいそうな気がします。

Request_Curl::execute:184行目
https://github.com/fuel/core/blob/1.9/develop/classes/request/curl.php

例外定義:5行目
https://github.com/fuel/core/blob/1.9/develop/classes/request/driver.php

投稿2016/04/21 10:27

nnssn

総合スコア1221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/04/21 23:31 編集

お答えいただきありがとうございます。 ご指摘の通り、500番台でも同じように404エラーが返ってきました。 これがFuelPHPの仕様だとすると、ステータスコードによって処理を変えたい場合には自分でRequest_Curlクラスを拡張して使わないといけないようですね。 elseif ($this->response->status >= 400) の部分を削って使おうと思います。 お付き合いいただきありがとうございました。 こちらをベストアンサーとさせていただきます。
guest

0

ログインコントローラの最後の部分

PHP

1 return View::forge('login', [ 2 'val' => $val, 3 ]);

ここ単体で正常に動きますか?(ここが怪しい気がします。)

API単体で動いていて、ログインが成功する操作が正常に動くということは、
以下のif文のtrueは正常かと思います。

PHP

1 // 認証API 2 $auth = new Authentication(); 3 if ($auth->check($id, $password)) 4 { 5 ~省略~ 6 }

無理やりfalseにするかコメントアウトをしてログイン失敗のテストをしてみて下さい。

投稿2016/04/21 09:05

編集2016/04/21 09:08
tonarino210

総合スコア228

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/04/21 09:10

$auth->check($id, $password) で必ずfalseが返るようにしてみましたが、意図した通りにset_flashしたエラーメッセージが表示されました。
tonarino210

2016/04/21 10:23

すみません、すぐに同じような環境を構築するのが難しいため推測で回答しております。 次に怪しいのがAPIアクセスクラスの「$curl->execute();」かな・・・ 「$curl->execute();」実行時に例外として処理されHttpNotFoundException(404エラー)をスローしているかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問