Laravel API:在 Laravel 中創建和測試 API
已發表: 2023-05-10Laravel Eloquent 是一種與數據庫交互的簡單方法。 它是一種對象關係映射器 (ORM),通過提供與表交互的模型來簡化數據庫的複雜性。
因此,Laravel Eloquent 擁有出色的工具來創建和測試 API 以支持您的開發。 在這篇實踐文章中,您將看到使用 Laravel 創建和測試 API 是多麼容易。
在此演示中,您將首先創建一個可用於構建 API 和數據庫表的模型。 然後,您將看到如何添加控制器作為業務邏輯層和路由來完成 API。 然後,您將學習如何使用 Postman 執行測試 API,最後專注於身份驗證和錯誤處理。
先決條件
開始之前,您需要:
- Laravel 版本 8 或 9
- 作曲家
- 郵差
- XAMPP
- API 和 PHP 的基礎知識
API基礎知識
首先使用 <code>composer</code> 創建一個新的 Laravel 項目:
composer create-project laravel/laravel laravel-api-create-test
要啟動服務器,請執行以下命令,該命令在端口 8000 上運行應用程序服務器:
cd laravel-api-create-test php artisan serve
您應該看到以下屏幕:
然後,使用以下代碼為遷移創建一個帶有-m
標誌的模型:
php artisan make:model Product -m
現在升級遷移文件以包含必填字段。 在database/migrations/{date_stamp}_create_products_table.php文件中為產品模型和這兩個表字段添加標題和描述字段。
$table->string('title'); $table->longText('description');
下一步是使這些字段可填寫。 在app/Models/ Product.php中,將title
和description
設為可填寫字段。
protected $fillable = ['title', 'description'];
如何創建控制器
現在,通過執行以下命令為產品創建一個控制器文件。 這將創建app/Http/Controllers/Api/ProductController.php文件。
php artisan make:controller Api\\ProductController --model=Product
現在,添加創建和檢索產品的邏輯。 在index
方法中,添加以下代碼以檢索所有產品:
$products = Product::all(); return response()->json([ 'status' => true, 'products' => $products ]);
之後,您必須添加一個StoreProductRequest
類,用於將新產品存儲在數據庫中。 在同一文件的頂部添加以下類。
public function store(StoreProductRequest $request) { $product = Product::create($request->all()); return response()->json([ 'status' => true, 'message' => "Product Created successfully!", 'product' => $product ], 200); }
現在,您將創建請求,您可以通過執行以下命令來創建請求:
php artisan make:request StoreProductRequest
如果要添加驗證,可以使用app/Http/Requests/StoreProductRequest.php文件。 對於此演示,沒有驗證。
如何創建路線
測試 API 之前的最後一步是添加路由。 為此,在routes/api.php文件中添加以下代碼。 在文件開頭添加use
語句,在body中添加Route
語句:
use App\Http\Controllers\Api\ProductController; Route::apiResource('products', ProductController::class);
在開始測試 API 之前,請確保產品表在您的數據庫中。 如果不存在,請使用 XAMPP 等控制面板創建一個。 或者,您可以執行以下命令來遷移數據庫:
php artisan migrate
如何測試 API
在測試 API 之前,確保app/Http/Requests/StoreProductRequest.php中的 <code>authorize</code> 方法設置為返回 <code>true</code>。
現在,您可以使用 Postman 創建新產品。 首先向此 URL 發出POST
請求:http://127.0.0.1:8000/api/products/。 因為這是創建新產品的POST
請求,所以您必須傳遞一個帶有標題和描述的 JSON 對象。
{ "title":"Apple", "description":"Best Apples of the world" }
單擊發送按鈕後,您應該看到以下內容:
現在,使用GET
請求獲取創建的產品。 網址是一樣的。 結果將如下所示:
如何使用 Sanctum 驗證 API
在保護 API 時,身份驗證至關重要。 Laravel 通過提供 Sanctum 令牌的功能使其變得簡單,您可以將其用作中間件。 它使用用戶使用正確憑據登錄時生成的令牌來保護 API。 請記住,如果沒有令牌,用戶將無法訪問受保護的 API。
添加身份驗證的第一步是使用以下代碼添加 Sanctum 包:
composer require laravel/sanctum
然後,發布 Sanctum 配置文件:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
之後,添加 Sanctum 的令牌作為中間件。 在app/Http/Kernel.php文件中,使用以下類並在受保護的中間件組的 API 中將middlewareGroups
替換為以下代碼。
use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
下一步是創建一個UserController
並添加代碼以獲取要進行身份驗證的令牌。
php artisan make:controller UserController
創建UserController
後,導航到app/Http/Controllers/UserController.php文件並將現有代碼替換為以下代碼:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; use Illuminate\Support\Facades\Hash; class UserController extends Controller { // function index(Request $request) { $user= User::where('email', $request->email)->first(); // print_r($data); if (!$user || !Hash::check($request->password, $user->password)) { return response([ 'message' => ['These credentials do not match our records.'] ], 404); } $token = $user->createToken('my-app-token')->plainTextToken; $response = [ 'user' => $user, 'token' => $token ]; return response($response, 201); } }
在您可以測試身份驗證之前,請創建一個使用播種機的用戶。 以下命令創建一個UsersTableSeeder文件。
php artisan make:seeder UsersTableSeeder
在database/seeders/UsersTableSeeder.php文件中,將現有代碼替換為以下代碼以播種用戶:
<?php namespace Database\Seeders; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; class UsersTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('users')->insert([ 'name' => 'John Doe', 'email' => '[email protected]', 'password' => Hash::make('password') ]); } }
現在使用此命令運行播種機:
php artisan db:seed --class=UsersTableSeeder
身份驗證流程中剩下的最後一步是使用創建的中間件來保護路由。 導航到routes/api.php文件並在中間件中添加產品路由。
use App\Http\Controllers\UserController; Route::group(['middleware' => 'auth:sanctum'], function () { Route::apiResource('products', ProductController::class); }); Route::post("login",[UserController::class,'index']);
將路由添加到中間件後,如果您嘗試獲取產品,則會出現內部服務器錯誤。
但是一旦你登錄,獲得一個令牌,並在標題中使用它,它就會對你進行身份驗證並開始工作。 您可以使用以下正文向 http://127.0.0.1:8000/api/login 發送 POST 請求:
{ "email":"[email protected]", "password":"password" }
使用收到的令牌作為 Bearer 令牌並將其添加為授權標頭。
如何處理 API 錯誤
每當您向服務器發送請求時,它都會響應。 對於響應,它還會根據響應的性質發送狀態代碼。 例如,200 狀態碼表示請求成功,404 表示服務器找不到請求的資源。
但是,狀態代碼是不夠的。 需要人類可讀的錯誤消息。 Laravel 有很多方法來處理錯誤。 您可以使用 try-catch 塊、回退方法或發送自定義響應。 您添加到UserController
以下代碼對此進行了演示。
if (!$user || !Hash::check($request->password, $user->password)) { return response([ 'message' => ['These credentials do not match our records.'] ], 404); }
方法概括
Laravel 的雄辯模型讓創建、驗證和測試 API 變得毫不費力。 它的對象關係映射提供了一種與數據庫交互的直接方法。
此外,作為中間件,Laravel 的 Sanctum 令牌可以幫助您快速保護 API。
如果您需要進一步優化,Kinsta 的數據庫託管解決方案可以簡化您所有 Web 項目的數據庫設置和管理。