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 项目的数据库设置和管理。