Laravel5.1 响应--Response

摘要:
最基本的HTTP响应只需在路由闭包或控制器动作中返回一个简单字符串即可,但是具体业务逻辑中大部分响应都是在控制器动作中返回Response实例或者视图。此外,需要注意的是,IlluminateHttpResponse类中还使用了ResponseTrait,header方法正是该trait提供的,除了header之外,该trait还提供了withCookie、content和status方法。header方法用于设置响应头信息,withCookie方法用于添加cookie,这两个方法都会返回调用它的Response自身对象,所以这两个方法都支持方法链;而content和status方法则用于返回当前响应的响应实体内容和响应状态码。

最基本的HTTP响应只需在路由闭包或控制器动作中返回一个简单字符串即可,但是具体业务逻辑中大部分响应都是在控制器动作中返回Response实例或者视图。Response是继承自SymfonyComponentHttpFoundationResponseIlluminateHttpResponse类的一个实例,我们可以使用该实例上的一系列方法来创建HTTP响应:

Route::get('testResponse', function(){
    $content = '测试response';
    $status = 200;
    $value = 'text/html;charset=utf-8';
    $response = new IlluminateHttpResponse($content,$status);
    return $response->header('Content-Type', $value);
});

我们可以使用浏览器的开发者工具查看此次响应。

其实为了方便使用,我们可以使用全局帮助函数:

Route::get('testResponse', function(){
    $content = '测试response';
    $status = 500;
    $value = 'text/html;charset=utf-8';
    return response($content,$status)->header('Content-Type',$value);
});

以上代码我们把状态码修改成了500,使用浏览器的开发者工具可以查看头信息,此外我们使用的response()是全局帮助函数,以后我们将默认使用这种方式 它们的效果是一样的,不再生成Response对象实例。

此外,需要注意的是,IlluminateHttpResponse类中还使用了ResponseTraitheader方法正是该trait提供的,除了header之外,该trait还提供了withCookiecontentstatus方法。

header方法用于设置响应头信息,withCookie方法用于添加cookie,这两个方法都会返回调用它的Response自身对象,所以这两个方法都支持方法链(即多次调用headerwithCookie方法);而contentstatus方法则用于返回当前响应的响应实体内容和响应状态码。

添加cookie

正如上面提到的,我们使用withCookie方法为响应添加cookie,由于headerwithCookie支持方法链,所以我们可以这样使用:

Route::get('testResponse', function(){
    $content = '测试response';
    $status = 200;
    $value = 'text/html;charset=utf-8';
    return response($content,$status)->header('Content-Type',$value)->withCookie('site','addCookie');
});

在浏览器工具中可以清楚的看见名为site的cookie被添加了。

如果有需要 可以指定cookie的有效期,作用域信息等:

return response($content,$status)->header('Content-Type',$value)->withCookie('site','addCookie',30,'/','test.app');

我们可以观察到cookie是加密的,这也是为了安全考虑,如果你不想加密cookie的话 到app/Http/Middleware/EncryptCookies.php文件中将对应的cookie名添加到EncryptCookies类属性$except中即可:

    protected $except =[
        'site',];

极力反对这样的做法。。。

ResponseFactory

我们在上面所用到的全局帮助函数 response() 方法 当不传入任何参数时 该方法内部会返回一个ResponseFactory给我们,它是IlluminateContractsRoutingResponseFactory契约的实现。

ResponseFactory提供了非常多的方法来生成丰富的相应类型,如:试图响应,json,文件下载。

视图相应

Route::get('testResponse', function(){
    $value = 'text/html;charset=utf-8';
    return response()->view('hello',['message'=>'我们正在学习response'])->header('Content-Type',$value);
});

然后我们只需要创建hello.blade.php文件 将message传入就好了。

如果你不需要自定义响应头的话 直接使用view()这个全局帮助函数会更方便,效果是一样的:

Route::get('testResponse', function(){
    return view('hello',['message'=>'我们正在学习response']);
});

Json相应

Route::get('testResponse', function(){
    return response()->json(['id'=>1, 'name'=>'ask']);
});

使用浏览器开发者工具查看,根据输出信息可见,json方法会自动设置Content-Typeapplication/json,并调用PHP内置函数json_encode讲数组转化为json格式字符串。

文件下载

Route::get('testResponse', function(){
    return response()->download(
        realpath(base_path('public/images')).'/20150621200925_NMjYu-2.jpeg',
        'testDownload.jpeg');
});

RedirectResponse--重定向

重定向我们之前使用过,重定向响应是IlluminateHttpRedirectResponse类的实例,我们通常使用全局帮助函数redirect来生成RedirectResponse实例。和response类似,redirect函数如果接收参数则调用的是IlluminateRoutingRedirector类的to方法,如果无参调用则返回的是Redirector对象实例。

最基本的重定向

Route::get('testRedirect', function(){
    return redirect('/test');
});

Route::get('/test',function(){
    return '测试重定向';
});

使用back方法 重定向到上一个位置:

Route::get('/back', function(){
    return back()->withInput();
});

重定向到路由命名

Route::get('testRedirect', function(){
    return redirect()->route('update',[100]);
});

Route::get('/articles/update/{id}',['as'=>'update', function($id){
    return '修改文章'.$id;
}]);

如果没有参数的话 就不用带参数。

重定向到控制器动作

Route::resource('articles', 'ArticlesController');

Route::get('/testRedirect',function(){
    return redirect()->action('ArticlesController@index');
});

也可以跟上参数:

Route::resource('articles', 'ArticlesController');

Route::get('/testRedirect',function(){
    return redirect()->action('ArticlesController@edit',[2]);
});

带一次性session数据的重定向

这种重定向很有用,使用with方法可以携带一次性session数据到重定向请求页面(一次性session数据即使用后立即销毁的session数据项):

Route::resource('articles', 'ArticlesController');

Route::get('/testRedirect',function(){
    return redirect()->action('ArticlesController@index')->with('message','欢迎来到文章列表');
});

对应的index方法:

    public functionindex()
    {
        return view('home');
    }

home.blade.php中的代码:

@extends('app')

@section('content')
    @if(!empty(session('message')))
        {{session('message')}}
    @endif@stop

免责声明:文章转载自《Laravel5.1 响应--Response》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Redis 新特性---pipeline(管道)观察网络流量的工具-iptraf-ng下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用nginx反向代理解决前端跨域问题

1. 首先去Nginx官网下载一个最新版本的Nginx,下载地址:http://nginx.org/en/download.html。我这里下载的版本是:nginx/Windows-1.12.0。下载完成之后,得到一个.zip的压缩包,把压缩包解压到E盘根目录。如图1-1 2. 打开目录 E: ginxconf ,编辑nginx.conf文件,修改成如...

Asp.Net WebAPI 中Cookie 获取操作方式

1. /// <summary> ///获取上下文中的cookie /// </summary> /// <returns></returns> [HttpGet] [HttpPost] public stringGetOne() { //1.在WebApi中这种方式获取cookie...

十三、nginx 强制下载txt等文件

当前的浏览器能够识别文件格式,如果浏览器本身能够解析就会默认打开,如果不能解析就会下载该文件。 那么使用nginx做资源服务器的时候,如何强制下载文件呢? location /back/upload/file/ { if ($request_filename ~* ^.*?.(txt|pdf|doc|xls)$){...

HTTP协议详解(深入理解)

版权声明:本文为CSDN博主「有抱负的小狮子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_38087538/article/details/82838762 引入 超文本传输协议(HTTP,HyperText Transfer Protocol...

jsp弹出新窗口代码

1、最基本的弹出窗口代码其实代码非常简单:  <SCRIPT LANGUAGE="javascript">   <!--   window.open (page.html); --> </SCRIPT>     因为这是一段javascripts代码,所以它们应该放在<SCRIPT LANGUAGE="j...

AWVS安装与基础

--- 下一步 AWVS简介1.AWVS是一个自动化WEB应用程序安全测试工具,审计检查漏洞sql注入,xss夸站点脚本攻击和其他能被黑客利用的漏洞和网页应用2.为什么要用AWVS 黑客具备广泛攻击手段,sql注入,xss,文件包含,目录遍历,参数篡改,绕过等,用软件来解决功能简介1.整站扫描2.站点爬行3.发现目标4.子域名扫描5.盲SQL注射6.HTT...