Laravel API:在Laravel中创建和测试一个API

Laravel API:在Laravel中创建和测试一个API

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

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

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

  1. 先决条件
  2. API基础知识
  3. 如何创建一个控制器
  4. 如何创建一个路由
  5. 如何测试一个API
  6. 如何使用Sanctum认证一个API
  7. 如何处理API的错误

先决条件

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

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 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中创建一个新产品

在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="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的安全.

评论留言