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