iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 30
0
Software Development

後端基礎PHP+Mysql & Laravel 30日養成計畫系列 第 30

Day 30 Laravel 5.8 會員註冊及登入系統API: Middelware、Router、 PostMan 測試

For API 的 Router

去config資料夾下面找auth這個檔案,總共有三個地方要改。
首先要把defaults的guard從web改成api:

'defaults' => [
       'guard' => 'api',
       'passwords' => 'users',
   ],

更改guards裡[api]的內容 :
driver是驗證方式,這邊要是token;
而provider則是資料庫的table名。

   'guards' => [
        'api' => [
            'driver' => 'token',
            'provider' => 'members',
            'hash' => false,
        ],

底下的provider也要更改:

        'members' => [
            'driver' => 'eloquent',
            'model' => App\Member::class,
        ],

要記得把上面的Model 改成extends Authenticatable

use Illuminate\Foundation\Auth\User as Authenticatable;

class Member extends Authenticatable{
//.....

再來是routes資料夾下的api.php:

  • middleware驗證要走的路:Route::middleware(‘auth:api’) → 驗證後面帶的參數,這邊的auth是對應到config/auth裡的guard下定義的驗證方式。
  • 不同method和URI所對應的controller。
    *Route::get → RESTFUL中的方法 postman測試時網址都一樣,是根據前面選擇不同的方法走不同的method。

api.php

<?php

use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::middleware('auth:api')->get('/member', function (Request $request) {
    return $request->member();
});

Route::post('member', 'MemberController@store'); //註冊
Route::post('login', 'LoginController@login'); //登入


Route::middleware('auth:api')->get('member', 'MemberController@index');  //查看
Route::middleware('auth:api')->put('member', 'MemberController@update'); //編輯
Route::middleware('auth:api')->delete('member/{members}', 'MemberController@destroy'); //刪除
Route::middleware('auth:api')->get('logout', 'LogoutController@logout'); //登出

PostMan測試

先去裝好PostMan,怎麼安裝就不再這多做說明了。
cd到專案目錄下,打開server:

$php artisan serve

接著打開post man,如下表所示,URL依照要執行的動作輸入。

動作 HTTP Method URL
會員註冊 post http://localhost:8000/api/member
管理者註冊 post http://localhost:8000/api/admin
會員登入 post http://localhost:8000/api/login
會員查看 get http://localhost:8000/api/member
會員編輯 put http://localhost:8000/api/member
會員刪除 delete http://localhost:8000/api/member/member_id
會員登出 get http://localhost:8000/api/logout

將資料放在body(form-data或x-www-form-urlencoded)傳送,欄位名稱要和這邊的一樣

$request->validate([
				'email' => ['required', 'string', 'email', 'max:255', 'unique:members'],
				'password' => ['required', 'string', 'min:6', 'max:12'],
			]);

登入會員的欄位名稱要和$request->XXX一樣:

$member = Member::where('email', $request->email)->where('password', $request->password)->first();

例如,管理者註冊:
https://ithelp.ithome.com.tw/upload/images/20191015/20120024LcQE95VutB.png
https://ithelp.ithome.com.tw/upload/images/20191015/20120024NYxNUPZGq6.png
拿到api token後,點Authorization,type選Bearer Token:
除了登入之外,其他無論查看、編輯、刪除等動作都是依這組token驗證使用者身份。
例如,管理者刪除會員:
https://ithelp.ithome.com.tw/upload/images/20191015/20120024u6XosXy4LM.png
https://ithelp.ithome.com.tw/upload/images/20191015/20120024h6sopDS5pu.png

Postman放在body的raw(json)為什麼server拿得到資料,在postman上卻看不到response?

content type要是application/json才能看到response內容

Laravel新手常見錯誤集錦

  • The XX method is not support :再撿查一次如果postman上的URL沒錯,method也沒選錯的話,可能是routes.php的路徑打錯。
  • 如果terminal上出現這個:Invalid request (Unsupported SSL request),先檢查http有沒有多打一個s
  • 如果URL已經打了api但還是只能看到Laravel首頁,這八成表示你的程式碼有問題。要debug前,先在header加入這個:Accept:application/json,表示回傳的內容只接受json格式。
  • 錯誤訊息:"SQLSTATE[HY000]: General error: 1364 Field '欄位名稱' doesn't have a default value:去檢查Model的fillable中有沒有增加到這個欄位。
    *資料欄位該填的明明都已經填好了,卻還是得到這樣的回覆 "message": "The given data was invalid." :可能body的欄位名稱和request->['欄位']其中一個打錯了,這兩邊的欄位名稱必須一致。
  • 錯誤訊息:"message": "Class '\\App\\User' not found",檢查config檔有沒有修改正確。
  • 錯誤訊息:"Method Illuminate\\Validation\\Validator::validateRequire does not exist.",檢查XXcontroller@store(或任何有用到validate的method),是'required'不是'require'
     $request->validate([
                'post' => ['required'],
            ]);

上一篇
Day 29 Laravel 5.8 會員註冊及登入系統API:Model & Controller
下一篇
Day 31 用Laravel儲存圖片
系列文
後端基礎PHP+Mysql & Laravel 30日養成計畫36

2 則留言

0
Howard
iT邦新手 5 級 ‧ 2019-10-16 22:05:37

賀完賽/images/emoticon/emoticon64.gif

0
jing_5566
iT邦新手 5 級 ‧ 2020-01-23 12:37:39

fillable 真的常常忘記...

我要留言

立即登入留言