用postman模拟请求发送表单数据的时候会出现如下错误
原因
这是由于laravel框架自带的csrf_token防护中间件的原因。这个中间件的位置在/app/middleware/VrifyCsrfToken.php。这个中间件的作用就是为了过滤Post请求。
解决方法
进入:laravel/app/Middleware/VerifyCsrfToken.php
1、找到csrf的中间件,然后可以按照我下面的代码来修改
public function handle($request, Closure $next)
{
// 使用CSRF
return parent::handle($request, $next);
// 禁用CSRF
//return $next($request);
}
当使用CSRF的时候,选用上面的代码。当禁用的时候,选用下面的代码。
2、有的时候我们既需要开启CSRF防护,又需要在一些特性的post请求时不带csrf_token(),怎么办?
答:laravel框架为我们提供了一个特殊的属性,如下所示:
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
'upload',
'rsa_post',
];
/* public function handle($request, Closure $next)
{
// 使用CSRF
return parent::handle($request, $next);
// 禁用CSRF
//return $next($request);
}*/
}
这段代码的意思是利用except来进行路由过滤。在我们except中的是我们不想被防护的路由名称。此处的’upload’和’rsa_post’,都是我需要post方式访问的路由。大家可以自己试一下,经过测试,这种方式是完全没问题的。
获取路由参数
访问
路由
Route::any('store/{id}','UserController@store');
public function store(Request $request,$id)
{
//访问请求实例-2
echo $id;
}
获取请求路径
访问
路由
Route::any('store/{id?}','UserController@store');
public function store(Request $request,$id=0)
{
//获取请求路径
echo $uri=$request->path()."<br>";
}
获取请求URL
访问
路由
Route::any('store/{id?}','UserController@store');
public function store(Request $request,$id=0)
{
// 不包含查询字符串
echo $request->url()."<br>";
// 包含查询字符串
echo $request->fullUrl();
}
获取请求方法
访问
路由
Route::any('store/{id?}','UserController@store');
public function store(Request $request,$id=0)
{
echo $request->method()."<br>";
if($request->isMethod('post')){
echo "post";
}
else{
echo "not post";
}
}
获取所有输入值
访问http://localhost/laravel/public/store?name=1
路由
Route::any('store/{id?}','UserController@store');
public function store(Request $request,$id=0)
{
// 获取所有参数
$input = $request->all();
print_r($input);
}
获取单个输入值
访问
post数据为
$Stu = [
[
‘username’=>123,
‘password’=>123
]
];
路由
Route::any('store/{id?}','UserController@store');
public function store(Request $request,$id=0)
{
//获取一个参数
echo $request->input('name')."<br>";
//设置默认值
echo $request->input('name', 'Sally')."<br>";
//处理表单数组
print_r($request->input('Stu.0'));
}
使用一些简单的方法,就可以从 Illuminate\Http\Request 实例中访问用户输入。你不需要关心请求所使用的 HTTP 请求方法,因为对所有请求方式的输入都是通过 input 方法获取用户输入:
$name = $request->input('name');
你还可以传递一个默认值作为第二个参数给 input 方法,如果请求输入值在当前请求未出现时该值将会被返回:
$name = $request->input('name', 'Sally');
处理表单数组输入时,可以使用”.”来访问数组输入:
$input = $request->input('Stu.0');
通过动态属性获取输入
此外,你还可以通过使用 Illuminate\Http\Request 实例上的动态属性来访问用户输入。例如,如果你的应用表单包含 name 字段,那么可以像这样访问提交的值:
访问
路由
Route::any('store/{id?}','UserController@store');
public function store(Request $request,$id=0)
{
echo "name为".$request->name."<br>";
echo "age为".$request->age."<br>";
echo "id为".$request->id."<br>";
}
获取JSON输入值
发送JSON请求到应用的时候,只要 Content-Type 请求头被设置为 application/json,都可以通过 input 方法获取 JSON 数据,还可以通过“.”号解析数组:
访问
路由
Route::any('store/{id?}','UserController@store');
public function store(Request $request,$id=0)
{
$name = $request->input('user.name');
}
获取输入的部分数据
如果你需要取出输入数据的子集,可以使用 only 或 except 方法,这两个方法都接收一个数组或动态列表作为唯一参数
访问
参数为
[
username=>aliu,
password=>123,
age=>18,
sex=>male
]
路由
Route::any('store/{id?}','UserController@store');
public function store(Request $request,$id=0)
{
// $input = $request->only('username', 'password'); 效果如下
$input = $request->only(['username', 'password']);
print_r($input);
echo "<br>";
//$input = $request->except('age');效果如下
$input = $request->except(['age']);
print_r($input);
}
only 方法返回你所请求的所有键值对,即使输入请求中不包含你所请求的键,当对应键不存在时,对应返回值为 null,如果你想要获取输入请求中确实存在的部分数据,可以使用 intersect 方法:
参数跟访问地址跟上面一样
路由
Route::any('store/{id?}','UserController@store');
public function store(Request $request,$id=0)
{
// $input = $request->only('username', 'password'); 效果如下
$input = $request->only(['username', 'password']);
print_r($input);
echo "<br>";
//$input = $request->except('age');效果如下
$input = $request->except(['age']);
print_r($input);
echo "<br>";
$input = $request->intersect(['username', 'password']);
print_r($input);
}
判断输入值是否存在
判断值是否在请求中存在,可以使用 has 方法,如果值出现过了且不为空,has 方法返回 true:
访问
路由
Route::any('store/{id?}','UserController@store');
public function store(Request $request,$id=0)
{
if ($request->has('name')) {
echo "有name这个参数";
}
else
{
echo "没有name这个参数";
}
echo "<br>";
if ($request->has('age')) {
echo "有age这个参数";
}
else
{
echo "没有age这个参数";
}
}
总结
虽然只是一些基础操作,但是基础操作还是搞的我团团转。继续努力。