API 系列教程(一):基于 Laravel 5.5 构建 和 测试 RESTful API

基于 Laravel 5.5 构建与测试 RESTful API 教程
本教程详细介绍了如何使用 Laravel 5.5 构建和测试 RESTful API,包括理解 RESTful 架构、HTTP 动词的应用、资源管理、路由和控制器的创建、API 认证流程(如注册、登录和退出)、以及测试接口的方法。教程通过实例展示了如何创建 Laravel 项目,设置数据库和模型,以及如何编写和运行测试用例,确保 API 的正确性和安全性。

随着移动开发和 JavaScript 框架的日益流行,使用 RESTful API 在数据层和客户端之间构建交互接口逐渐成为最佳选择。

在本系列教程中,将会带领大家基于 Laravel 5.5 来构建并测试带认证功能的 RESTful API。

RESTful API

先要了解什么是 RESTful API。REST 是 Representational State Transfer 的缩写,表示一种应用之间网络通信的架构风格,依赖于无状态的协议(通常是HTTP)进行交互。

通过 HTTP 动词表示操作

在 RESTful API 中,我们使用 HTTP 动词表示操作,而端点是操作的资源,HTTP 动词的语义如下:

  • GET:获取资源
  • POST:创建资源
  • PUT:更新资源
  • DELETE:删除资源

更新操作:PUT vs POST

关于 RESTful API 有一些争议,比如更新资源使用 POST、PATCH 还是 PUT 哪一个更好?

在本教程中,我们使用 PUT 进行更新操作,因为基于 HTTP RFC 标准,PUT 的含义是在指定位置上创建/更新资源;使用 PUT 的另一个原因是幂等性,这意味着不管你发送一次、两次还是上千次请求,操作结果都一致。

资源

在 RESTful API 中,资源指的是操作的对象,在我们的例子中就是文章(Articles)和用户(Users)。

它们各自的端点是:

  • /articles
  • /users

在我们的教程中,资源和数据模型一一对应,但这并不是强制性的要求。

关于一致性的注意项

使用 REST 的最大好处是更容易消费和开发 API,一些端点非常直截了当,这样相较于类似 GET /get_article?id_article=12 这样的端点 RESTful API 更容易使用和维护。

不过,在某些案例中映射到 Create/Retrieve/Update/Delete 可能会很困难。

需要牢记的是: URL 中不要包含任何动词而且资源并不一定非得是数据表的某一行数据。另一个需要记住的是不必为每个资源实现所有操作。

构建一个新的 Laravel 项目

创建新应用

首先,通过 Composer 来安装 Laravel 5.5。

composer create-project --prefer-dist laravel/laravel apidemo 5.5.*

然后,自行配置 web 服务器,并修改 hosts 文件。

127.0.0.1 apidemo.test

检测是否可以正常访问 http://apidemo.test 。

修改 config/app.php 中的时区 timezone 配置:

'timezone' => 'Asia/Shanghai',

创建迁移和模型

在编写第一个迁移之前,需要将 .env 文件中的环境变量调整为开发环境中的数据库配置。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=apidemo
DB_USERNAME=root
DB_PASSWORD=root

接下来,就可以开始创建我们的第一个 Article 模型及其对应的迁移文件。

在项目根目录,运行如下 Artisan 命令一步到位:

php artisan make:model Article -m

-m 是 --migration 的缩写,告知 Artisan 在创建模型的同时创建与之对应的迁移文件。

上述命令创建的模型文件是 app/Article.php,迁移文件是 database/migrations/2018_04_03_160023_create_articles_table.php。

当然,还需要编辑该迁移文件的内容:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateArticlesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title', 100);
            $table->text('body');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('articles');
    }
}

然后,运行命令 php artisan migrate ,就会根据迁移文件来创建对应的数据表结构了。

php artisan migrate

执行成功后,就可以看到 apidemo 数据库中自动生成了 4 张表,articles、migrations、password_resets 和 users。

当然,只有 articles 表是由我们手动生成的迁移文件来生成的。

由上述迁移文件生成的 articles 表的结构为:

CREATE TABLE `articles` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `body` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

修改模型

修改 Article 模型类,添加如下属性字段到 $fillable ,以便可以在 Article::create 和 Article::update 方法中使用它们。

class Article extends Model
{
    protected $fillable = ['title', 'body'];
}

数据库填充

Laravel 通过 Faker 库可以快速为我们生成格式正确的测试数据。

创建填充器类:

php artisan make:seeder ArticlesTableSeeder

填充器类默认会存放在 database/seeds 目录下。

编辑 database/seeds/ArticlesTableSeeder.php 填充器:

<?php

use Illuminate\Database\Seeder;
use App\Article;

class ArticlesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // Let's truncate our existing records to start from scratch.
        Article::truncate();

        $faker = \Faker\Factory::create();

        // And now, let's create a few articles in our database:
        for ($i = 0; $i < 50; $i++) {
            Article::create([
                'title' => $faker->sentence,
                'body' => $faker->paragraph,
            ]);
        }
    }
}

然后运行填充命令:

php artisan db:seed --class=ArticlesTableSeeder

类似地,再创建用户表填充器类:

php artisan make:seeder UsersTableSeeder

修改 database/seeds/UsersTableSeeder.php 文件:

<?php

use Illuminate\Database\Seeder;
use App\User;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // Let's clear the users table first
        User::truncate();

        $faker = \Faker\Factory::create();

        // Let's make sure everyone has the same password and
        // let's hash it before the loop, or else our seeder
        // will be too slow.
        $password = Hash::make('toptal');

        User::create([
            'name' => 'Administrator',
            'email' => 'admin@test.com',
            'password' => $password,
        ]);

        // And now let's generate a few dozen users for our app:
        for ($i = 0; $i < 10; $i++) {
            User::create([
                'name' => $faker->name,
                'email' => $faker->email,
                'password' => $password,
            ]);
        }
    }
}

然后,修改 database/seeds/DatabaseSeeder.php 文件:

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UsersTableSeeder::class);
        $this->call(Artic
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值