larvel 中的api.php_Laravel API 系列教程(一): 基于 Laravel 5.5 构建 & 测试 RESTful API...

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

由 学院君 创建于2年前, 最后更新于 8个月前

版本号 #3

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

资源

资源指的是操作的对象,在我们的例子中就是文章(Articles)和用户(Users),它们各自的端点是:

/articles

/users

在我们的教程中,资源和数据模型一一对应,但这并不是强制性的要求,一个资源可以表示多个数据模型(或者不代表数据库中的任何模型),你可以根据自己应用的需求来决定如何构建资源和模型的映射关系。

关于一致性的注意项

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

不过,在某些案例中映射到 Create/Retrieve/Update/Delete 可能会很困难,需要牢记的是 URL 中不要包含任何动词而且资源并不一定非得是数据表的某一行数据。另一个需要记住的是不必为每个资源实现所有操作。

设置一个新的 Laravel 项目

创建新应用

我们通过 Composer 来安装这个新项目:

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

安装完成后,如果使用 Valet 作为开发环境的话就可以直接在浏览器中通过 http://apidemo.test 访问了,如果使用 Laradock 或 Homestead 作为开发环境的话,还需要配置域名绑定:

127.0.0.1 apidemo.test

然后还要配置 Nginx 的配置文件,以 Laradock 为例,就是在 laradock/nginx/sites 目录下新建一个 apidemo.conf 配置文件,编辑其内容如下:

server {

listen 80;

listen [::]:80;

server_name apidemo.test;

root /var/www/apidemo/public;

index index.php index.html index.htm;

location / {

try_files $uri $uri/ /index.php$is_args$args;

}

location ~ \.php$ {

try_files $uri /index.php =404;

fastcgi_pass php-upstream;

fastcgi_index index.php;

fastcgi_buffers 16 16k;

fastcgi_buffer_size 32k;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

#fixes timeouts

fastcgi_read_timeout 600;

include fastcgi_params;

}

location ~ /\.ht {

deny all;

}

location /.well-known/acme-challenge/ {

root /var/www/letsencrypt/;

log_not_found off;

}

error_log /var/log/nginx/apidemo_error.log;

access_log /var/log/nginx/apidemo_access.log;

}

之后重新启动 Nginx:

docker-compose up --build -d nginx

就可以在浏览器中通过 http://apidemo.test 访问应用了:

迁移和模型

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

DB_CONNECTION=mysql

DB_HOST=mysql

DB_PORT=3306

DB_DATABASE=apidemo

DB_USERNAME=root

DB_PASSWORD=root

接下来就可以开始创建我们的第一个 Article 模型及其对应迁移文件了,我们在项目根目录运行如下 Artisan 命令一步到位:

php artisan make:model Article -m

-m 是 --migration 的缩写,告知 Artisan 在创建模型同时创建与之对应的迁移文件(我使用的是 Laradock 作为开发环境):

当然,还需要编辑默认生成的迁移文件:

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');

$table->text('body');

$table->timestamps();

});

}

/**

* Reverse the migrations.

*

* @return void

*/

public function down()

{

Schema::dropIfExists('articles');

}

}

然后我们运行如下命令创建对应数据表:

php artisan migrate

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

class Article extends Model

{

protected $fillable = ['title', 'body'];

}

数据库填充

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

php artisan make:seeder ArticlesTableSeeder

生成的填充器类位于 /database/seeds 目录下,我们编辑填充器类如下:

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

重复上述过程创建一个用户填充器:

use Illuminate\Database\Seeder;

use App\User;

class UsersTableSeeder extends Seeder

{

/**

* Run the database seeds.

*

* @return void

*/

public function run()

{

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值