实例讲解如何在Laravel中创建和测试一个API
在这个演示中, 你将开始创建一个模型,你可以用它来建立API和数据库表。然后, 你会看到如何添加一个控制器作为业务逻辑层和一个路由来完成API。然后,你将学习如何使用Postman来执行测试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
然后,使用下面的代码创建一个带有 -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 App\Http\Controllers\Api\ProductController;
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中创建一个新产品
点击Send按钮后,你应该看到以下内容:
点击 “Send” 后
现在,使用 GET
请求来获取所创建的产品。URL是一样的。结果将如下所示:
通过GET请求获取的产品
如何使用Sanctum认证API
在保证API安全的情况下,认证是至关重要的。Laravel通过提供Sanctum令牌的功能使之变得简单,你可以将其作为中间件使用。当用户使用正确的凭证登录时,它可以使用生成的令牌来保护API的安全。记住,没有令牌,用户就不能访问安全的API。
添加认证的第一步是使用下面的代码添加一个Sanctum包:
composer require laravel/sanctum
然后,发布Sanctum的配置文件:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
之后,添加Sanctum的token作为中间件。在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文件中,用下面的代码替换现有的代码,为用户提供seed:
<?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' => 'john@doe.com',
'password' => Hash::make('password')
]);
}
}
现在用这个命令运行seeder:
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":"john@doe.com",
"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的安全.
更多推荐
所有评论(0)