JSON

基本使用、生成Cookie、返回视图、JSON/JSONP、文件下载及重定

字号+ 作者:H5之家 来源:H5之家 2016-07-26 12:00 我要评论( )

Laravel学院致力于提供优质Laravel中文学习资源

1、Response篇 1.1 基本响应

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

use Illuminate\Http\Response; Route::get('testResponse',function(){ $content = 'Hello LaravelAcademy!'; $status = 200; $value = 'text/html;charset=utf-8'; return (new Response($content,$status))->header('Content-Type',$value); });

在浏览器中访问,F12查看响应头信息(Chrome浏览器):

基本响应

如果我们尝试修改$status=500,则头信息如下:

基本响应2

为方便使用,我们还可以使用全局帮助函数response来替代生成Response对象实例:

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

效果一样。以后我们将默认使用这种方式,不再生成Response对象实例。

此外,需要注意的是,Illuminate\Http\Response 类中还使用了ResponseTrait,header方法正是该trait提供的,除了header之外,该trait还提供了withCookie、content和status方法。header方法用于设置响应头信息,withCookie方法用于添加cookie,这两个方法都会返回调用它的Response自身对象,所以这两个方法都支持方法链(即多次调用header或withCookie方法);而content和status方法则用于返回当前响应的响应实体内容和响应状态码。

1.2添加Cookie

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

Route::get('testResponseCookie',function(){ $content = 'Hello LaravelAcademy!'; $status = 200; $value = 'text/html;charset=utf-8'; return response($content,$status)->header('Content-Type',$value) ->withCookie('site','LaravelAcademy.org'); });

在浏览器中访问,F12查看Cookie信息:

生成Cookie

我们还可以使用该cookie的有效期、作用域等信息:

Route::get('testResponseCookie',function(){ $content = 'Hello LaravelAcademy!'; $status = 200; $value = 'text/html;charset=utf-8'; //设置cookie有效期为30分钟,作用路径为应用根目录,作用域名为laravel.app return response($content,$status)->header('Content-Type',$value) ->withCookie('site','LaravelAcademy.org',30,'http://laravelacademy.org/','laravel.app'); });

注:withCookie方法实际上是调用了全局帮助函数cookie生成cookie,然后将cookie放到响应头中。

再次在浏览器中访问,F12查看cookie信息如下:

生成cookie

里面多出了有效期及作用域名等相关信息。

此外,我们还关注到该cookie是经过加密的,这一点我们在前面已经提到过,这是为了安全性考虑,如果要取消加密,在app/Http/Middleware/EncryptCookies.php文件中将对应的cookie名添加到EncryptCookies类属性$except中即可:

<?php namespace App\Http\Middleware; use Illuminate\Cookie\Middleware\EncryptCookies as BaseEncrypter; class EncryptCookies extends BaseEncrypter { /** * 不被加密的cookie名 * * @var array */ protected $except = [ 'site' ]; }

再次在浏览器中访问:8000/testResponseCookie,F12查看Cookie信息如下:

未加密cookie

当然,为了安全起见,我们不建议这么做。

2、ResponseFactory篇

response函数如果不传入参数会返回 Illuminate\Contracts\Routing\ResponseFactory契约的实现——Illuminate\Routing\ResponseFactory,该类中提供了多个方法用来生成更加丰富的响应类型,比如视图响应、JSON响应、文件下载等等。

2.1 视图响应

使用view方法即可返回一个视图作为响应内容:

Route::get('testResponseView',function(){ $value = 'text/html;charset=utf-8'; return response()->view('hello',['message'=>'Hello LaravelAcademy']) ->header('Content-Type',$value); });

与之对应的,我们需要在resources/views下新建一个视图文件hello.blade.php,其内容如下:

{{$message}}

接下来我们在浏览器中访问:8000/testResponseView,页面输出:

Hello LaravelAcademy

还可以再简化,如果我们不需要自定义HTTP响应头,还可以直接使用全局帮助函数view:

Route::get('testResponseView',function(){ $value = 'text/html;charset=utf-8'; return view('hello',['message'=>'Hello LaravelAcademy'])); });

效果和上面一样。

2.2 返回JSON/JSONP

还可以使用json方法返回json格式数据:

Route::get('testResponseJson',function(){ return response()->json(['name'=>'LaravelAcademy','passwd'=>'LaravelAcademy.org']); });

在浏览器中访问,F12查看响应头信息:

生成json响应

根据输出信息可见,json方法会自动设置Content-Type为application/json,并调用PHP内置函数json_encode讲数组转化为json格式字符串。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 在 Laravel 5.1 中使用SMTP驱动实现邮件发送(含附件和图片)详

    在 Laravel 5.1 中使用SMTP驱动实现邮件发送(含附件和图片)详

    2015-11-16 19:28

  • Laravel学院

    Laravel学院

    2015-10-28 13:45

  • Laravel 4 系列入门教程(一)【最适合中国人的Laravel教程】

    Laravel 4 系列入门教程(一)【最适合中国人的Laravel教程】

    2015-10-10 16:49

  • 优质Laravel中文学习资源平台

    优质Laravel中文学习资源平台

    2015-10-10 11:13

网友点评