laravel5.3创建api(接口),使用postman模拟访问api(接口)
前言
1,我们都知道,laravel是有CSRF验证机制的,那么创建api的时候要不要使用CSRF验证机制呢?
CSRF是什么,干什么用的。
- Laravel 可以轻松地保护应用程序免受 跨站请求伪造 (CSRF) 的攻击。跨站请求伪造是一种恶意的攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令。
- Laravel 会自动为每个活跃用户的会话生成一个 CSRF「令牌」。该令牌用于验证经过身份验证的用户是否是向应用程序发出请求的用户。
- 任何情况下当你在应用程序中定义 HTML 表单时,都应该在表单中包含一个隐藏的 CSRF 令牌字段,以便 CSRF 保护中间件可以验证该请求。可以使用辅助函数 csrf_field 来生成令牌字段:
通过上面的解释,我们知道CSRF是防跨域请求,但是api本来就是跨域访问的,所以要取消CSRF验证。
2,取消CSRF验证,或者把指定的路由过滤掉。
路径:F:\laravel\yzm\app\Http\Middleware\VerifyCsrfToken.php
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
//跳过CSRF验证的路由,因为是api。本来就是开放的,所以就跳过了。要是ajax请求的话也能设置CSRF验证。
protected $except = [
//api路由
'api/*',
];
}
3,定义一个api路由,并且返回json字符串。
路径:F:\laravel\yzm\routes\api.php
//测试api。用postman调用api
Route::post('/huihui',function(Request $request){
return response()->json([
'info'=>'请求成功'
]);
});
注意:在api下面定义的路由访问方式跟在web下面定义的路由访问方式不太一样。
4,访问api:www.laravel.com/api/huihui
PS:www.laravel.com/api/huihui 这个api是固定写法,如果不加api的话访问不到api下面的这个路由,这也是laravel为了区分是web路由还是api的路由。
5,用postman访问api
我们看到图中请求成功了,但是却报错了。错误信息如下:
Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0
Warning: Cannot modify header information - headers already sent in Unknown on line 0
{"info":"\u8bf7\u6c42\u6210\u529f"}
6,解决图中的报错信息
- laravel要想能正确的访问api,php的版本需要是:7.0,我这里用的是:5.6.27,所以会报以上错误。要是7.0就不会有这样的错误。
解决办法
1,打开php.ini文件,搜索下面的关键字:把前面的(;分号)去掉即可。重启服务。
;always_populate_raw_post_data = -1
2,访问效果如下:
pretty中输出的:会解析json字符串
{
"info": "请求成功"
}
preview中输出:在这个preview这个选项中输出的就是php报错信息。
{"info":"\u8bf7\u6c42\u6210\u529f"}
通过以上的操作,就可以正确的在laravel中定义api接口了。
前后端分离路由
- 当我们把路由写到一个文件中时,路由显得杂乱不堪,不利于维护,这时我们需要将laravel路由进行分离
实现步骤:
1、首先在app/Https/Controlles/下建立 Frontend(前端)、 Backend(后端)、 API(接口) 等文件夹;
定义一个简单的添加接口:
api路由如下:
- 路径:F:\laravel\yzm\routes\api.php
- 我用的是资源路由,使用php artisan 创建控制器。
Route::resource('/apitest','Api\Admin\ApiTestController');
创建控制器:
php artisan make:controller Api\Admin\ApiTestController
查看资源路由里面内置的请求方式,还有控制器方法:
F:\laravel\yzm>php artisan route:list
+--------+---------------+------------------------------+----------------------+---------------------------------------------------------------+----------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+---------------+------------------------------+----------------------+---------------------------------------------------------------+----------------+
| | GET|HEAD | _debugbar/assets/javascript | debugbar.assets.js | Barryvdh\Debugbar\Controllers\AssetController@js | |
| | GET|HEAD | _debugbar/assets/stylesheets | debugbar.assets.css | Barryvdh\Debugbar\Controllers\AssetController@css | |
| | GET|HEAD | _debugbar/clockwork/{id} | debugbar.clockwork | Barryvdh\Debugbar\Controllers\OpenHandlerController@clockwork | |
| | GET|HEAD | _debugbar/open | debugbar.openhandler | Barryvdh\Debugbar\Controllers\OpenHandlerController@handle | |
| | POST | admin/check | | App\Http\Controllers\Admin\LoginController@check | web |
| | GET|HEAD | admin/login | | App\Http\Controllers\Admin\LoginController@index | web |
| | GET|HEAD | api/apitest | apitest.index | App\Http\Controllers\Api\Admin\ApiTestController@index | api |
| | POST | api/apitest | apitest.store | App\Http\Controllers\Api\Admin\ApiTestController@store | api |
| | GET|HEAD | api/apitest/create | apitest.create | App\Http\Controllers\Api\Admin\ApiTestController@create | api |
| | DELETE | api/apitest/{apitest} | apitest.destroy | App\Http\Controllers\Api\Admin\ApiTestController@destroy | api |
| | PUT|PATCH | api/apitest/{apitest} | apitest.update | App\Http\Controllers\Api\Admin\ApiTestController@update | api |
| | GET|HEAD | api/apitest/{apitest} | apitest.show | App\Http\Controllers\Api\Admin\ApiTestController@show | api |
| | GET|HEAD | api/apitest/{apitest}/edit | apitest.edit | App\Http\Controllers\Api\Admin\ApiTestController@edit | api |
定义添加接口:
<?php
namespace App\Http\Controllers\Api\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ApiTestController extends Controller
{
//添加数据库测试api 请求方式:www.laravel.com/api/apitest post
public function store(Request $request){
//接收全部数据
$values = $request->all();
//var_dump($values);
//定义规则
$rule = [
'user'=>'required|unique:user,user',
'tel'=>'required',
'email'=>'required|email'
];
$message = [
'user.required'=>'用户名不能为空',
'user.unique'=>'用户名已存在',
'tel.required'=>'手机号不能为空',
'email.required'=>'邮箱不能为空',
'email'=>'邮箱格式不正确'
];
$validator = \Validator::make($values,$rule,$message);
if ($validator->passes()) {
$result = \DB::table('user')->insertGetId($values);
if ($result) {
return response()->json([
//返回数据格式 一
/*
'data'=>[
'id' => $result
],
'status'=>[
'code'=>'1',
'msg'=>'操作成功'
]*/
//返回数据格式 二
'data'=>[
'id'=>$result
],
'code'=>'1',
'msg'=>'操作成功'
]);
}else{
return response()->json([
'code'=>'0',
'msg'=>'操作失败'
]);
}
}else{
return response()->json([
'code'=>'10001',
'msg'=>$validator->errors()->first()
]);
}
}
//测试delete访问方式 请求地址:www.laravel.com/api/apitest delete
public function destroy($id){
return $id;
}
}
postman访问接口并且添加数据
header头部的参数:
请求添加数据:数据格式是json的。