实例讲解如何在Laravel中创建和测试一个API

Laravel Eloquent是一种简单的方式来与你的数据库互动. 它是一个对象关系映射器(ORM),通过提供一个与表互动的模型,简化了数据库的复杂性。

因此,Laravel Eloquent有很好的工具来创建和测试API来支持你的开发. 在这篇实践文章中, 你将看到使用Laravel创建和测试API是多么容易.

在这个演示中, 你将开始创建一个模型,你可以用它来建立API和数据库表。然后, 你会看到如何添加一个控制器作为业务逻辑层和一个路由来完成API。然后,你将学习如何使用Postman来执行测试API,最后再重点讨论认证和错误处理。

先决条件

要开始,这里是你需要的东西:

    • Laravel version 8 or 9
    • Composer
    • Postman
    • 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

Laravel

然后,使用下面的代码创建一个带有 -m 标志的模型来进行迁移:

php artisan make:model Product -m

现在升级迁移文件以包括所需字段。在数据库/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 语句,在正文中添加 Route 语句:

use AppHttpControllersApiProductController;

Route::apiResource('products', ProductController::class);

在你开始测试API之前,确保products表在你的数据库中。如果它不存在,用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中创建一个新产品

点击Send按钮后,你应该看到以下内容:

点击 "Send" 后

点击 “Send” 后

现在,使用 GET 请求来获取所创建的产品。URL是一样的。结果将如下所示:

通过GET请求获取的产品

通过GET请求获取的产品

如何使用Sanctum认证API

在保证API安全的情况下,认证是至关重要的。Laravel通过提供Sanctum令牌的功能使之变得简单,你可以将其作为中间件使用。当用户使用正确的凭证登录时,它可以使用生成的令牌来保护API的安全。记住,没有令牌,用户就不能访问安全的API。

添加认证的第一步是使用下面的代码添加一个Sanctum包:

composer require laravel/sanctum

然后,发布Sanctum的配置文件:

php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"

之后,添加Sanctum的token作为中间件。在app/Http/Kernel.php文件中,使用以下类,并在受保护的中间件组的API中用以下代码替换 middlewareGroups 。

use LaravelSanctumHttpMiddlewareEnsureFrontendRequestsAreStateful;

protected $middlewareGroups = [

'web' => [

AppHttpMiddlewareEncryptCookies::class,

IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,

IlluminateSessionMiddlewareStartSession::class,

// IlluminateSessionMiddlewareAuthenticateSession::class,

IlluminateViewMiddlewareShareErrorsFromSession::class,

AppHttpMiddlewareVerifyCsrfToken::class,

IlluminateRoutingMiddlewareSubstituteBindings::class,

],

'api' => [

EnsureFrontendRequestsAreStateful::class,

'throttle:api',

IlluminateRoutingMiddlewareSubstituteBindings::class,

],

];

下一步是创建一个 UserController ,并添加代码以获取令牌进行认证。

php artisan make:controller UserController

创建完 UserController 后,导航到app/Http/Controllers/UserController.php文件,用以下代码替换现有代码:

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;

use AppModelsUser;

use IlluminateSupportFacadesHash;

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文件中,用下面的代码替换现有的代码,为用户提供seed:

<?php

namespace DatabaseSeeders;

use IlluminateDatabaseSeeder;

use IlluminateSupportFacadesDB;

use IlluminateSupportFacadesHash;

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')

]);

}

}

现在用这个命令运行seeder:

php artisan db:seed --class=UsersTableSeeder

认证流程中剩下的最后一步是使用创建的中间件来保护路由。导航到routes/api.php文件,在中间件内添加产品路由。

use AppHttpControllersUserController;

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"

}

认证成功

认证成功

使用收到的令牌作为承载令牌,并将其添加为授权头。

添加承载者标记作为授权标头

添加承载者标记作为授权标头

如何处理API的错误

每当你向服务器发送请求时,它都会做出响应。随着响应的进行,它也会根据响应的性质发送一个状态代码。例如,200状态代码表明请求已经成功,而404则表明服务器无法找到所请求的资源。

然而,一个状态代码是不够的。一个人类可读的错误信息是必需的。Laravel有很多方法来处理错误. 你可以使用try-catch块, fallback方法, 或者发送一个自定义的响应. 下面你添加到 UserController 中的代码演示了这一点。

if (!$user || !Hash::check($request->password, $user->password)) {

return response([

'message' => ['These credentials do not match our records.']

], 404);

}

小结

Laravel的Eloquent Model使得创建, 验证, 和测试API变得毫不费力. 它的对象关系映射提供了一个直接的方法来与数据库进行交互。

此外, 作为中间件, Laravel的Sanctum token可以帮助你快速确保你的API的安全.