初学Laravel —— 请求

用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这个参数";
        }
}

这里写图片描述

总结

虽然只是一些基础操作,但是基础操作还是搞的我团团转。继续努力。

猜你喜欢

转载自blog.csdn.net/qq_33862778/article/details/80667492