响应和重定向
响应和重定向

响应就是前端页面通过发送请求给后端,后端给前端的反馈就叫响应。

在laravel中如果你直接使用return返回数组,那么laravel会隐性的帮你转换城JSON格式。

JSON格式数据

并且下面这三种的返回结果是一样的,都是JSON格式

Route::get('return',function (){
    return [1,2,3];
});

Route::get('response',function (){
    return response([1,2,3]);
});

Route::get('json',function (){
    return response()->json([1,2,3]);
});

那么使用response的意义在哪里

当然不会是无意义的,response可以设置返回的状态码,也可以设置响应标头信息

设置状态码

Route::get('response',function (){
    return response([1,2,3],201);
});

设置文档类型

Route::get('response',function (){
    return response('<h1>啊哈哈哈</h1>')->header('Content-Type', 'text/plain');
});

这样浏览器页面就不会解析html标签了,会直接把标签当文本输出,甚至可以将整个模板页面不解析html直接当文本输出出来,如下:

Route::get('response',function (){
    return response()->view('view',['id'=>1],201)->header('Content-Type', 'text/plain');
});

为响应附加头

return response($content)
            ->header('Content-Type', $type)
            ->header('X-Header-One', 'Header Value')
            ->header('X-Header-Two', 'Header Value');

return response($content)
            ->withHeaders([
                'Content-Type' => $type,
                'X-Header-One' => 'Header Value',
                'X-Header-Two' => 'Header Value',
            ]);

路由重定向

使用redirect()->to()进行重定向:

Route::get('index',function (){
    return redirect()->to('/'); //注意需要return才能生效
});

直接使用redirect()也能实现同样的效果:

//也可以这么写
Route::get('index',function (){
    return redirect('/'); //注意需要return才能生效
});

使用静态方法Redirect::to():

//静态调用写法
Route::get('index',function (){
    return Redirect::to('/'); //注意需要return才能生效
});

使用路由名称进行重定向

//使用路由名称进行重定向
Route::get('index',function (){
    return 'index';
})->name('name');

Route::get('route',function (){
    return redirect()->route('name');
});

路由回退到上一次的地址

//路由回退到上一次的地址
Route::get('back',function (){
    return redirect()->back('302'); //里面可以放状态码
});

路由重定向到控制器方法

Route::get('user',function (){
    return redirect()->action([TestController::class,'index'],['id'=>1]);//第二个参数可以传递参数
});

Route::get('test',[TestController::class,'index']); //如果redirect()->action()跳转的控制器方法没有注册路由,那就会报错控制器方法不存在

重定向到外部链接

Route::get('away',function (){
    return redirect()->away('http://www.baidu.com');
});

为响应附加 Cookie

Route::get('cookie',function (){
    return response("")->cookie('aa');
});

提前过期 Cookies

Route::get('cookie',function (){
    return response('Hello World')->withoutCookie('aa');
});

文件下载

Route::get('download',function (){
    return response()->download("robots.txt");
});

Route::get('download',function (){
    return response()->download($pathToFile, $name, $headers);
});

By cxp

发表回复