Laravel API:在 Laravel 中創建和測試 API

已發表: 2023-05-10

Laravel 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

您應該看到以下屏幕:

Laravel 登陸頁面
拉維

然後,使用以下代碼為遷移創建一個帶有-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中,將titledescription設為可填寫字段。

 protected $fillable = ['title', 'description'];
相信您已經有了下一個病毒式應用創意? 以下是您可以快速創建和測試 API 的方法️ 點擊推文

如何創建控制器

現在,通過執行以下命令為產品創建一個控制器文件。 這將創建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" }
在 Postman 中創建新產品
在 Postman 中創建新產品

單擊發送按鈕後,您應該看到以下內容:

點擊發送後的郵遞員
點擊發送後

現在,使用GET請求獲取創建的產品。 網址是一樣的。 結果將如下所示:

GET 請求獲取的產品。
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 令牌
認證成功

使用收到的令牌作為 Bearer 令牌並將其添加為授權標頭。

添加 Bearer 令牌作為授權標頭
添加 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); }
專注於 API 開發的有趣部分,而不必擔心其數據庫的複雜性。 這是點擊推文的方法

概括

Laravel 的雄辯模型讓創建、驗證和測試 API 變得毫不費力。 它的對象關係映射提供了一種與數據庫交互的直接方法。

此外,作為中間件,Laravel 的 Sanctum 令牌可以幫助您快速保護 API。

如果您需要進一步優化,Kinsta 的數據庫託管解決方案可以簡化您所有 Web 項目的數據庫設置和管理。