解读PHP的Yii框架中请求与响应的处理流程
一、请求(Requests)请求: 一个应用的请求是用 yiiwebRequest 对象来表示的,该对象提供了诸如 请求参数(译者注:通常是GET参数或者POST参数)、HTTP头、cookies等信息。 默认情况下,对于一个给定的请求,你可以通过 request application component 应用组件(yiiwebRequest 类的实例) 获得访问相应的请求对象。在本章节,我们将介绍怎样在你的应用中使用这个组件。1.请求参数要获取请求参数,你可以调用 request 组件的 yiiwebRequest::get() 方法和 yiiwebRequest::post() 方法。 他们分别返回 $_GET 和$_POST 的值。例如, request;$get = $request->get(); $id = $request->get('id'); $id = $request->get('id',1); $post = $request->post(); $name = $request->post('name'); $name = $request->post('name',''); 信息:建议你像上面那样通过 request 组件来获取请求参数,而不是 直接访问 $_GET 和 $_POST。 这使你更容易编写测试用例,因为你可以伪造数据来创建一个模拟请求组件。 当实现 RESTful APIs 接口的时候,你经常需要获取通过PUT, PATCH或者其他的 request methods 请求方法提交上来的参数。你可以通过调用 yiiwebRequest::getBodyParam() 方法来获取这些参数。例如, request;// 返回所有参数 // 返回参数 "id" 信息:不同于 GET 参数,POST,PUT,PATCH 等等这些提交上来的参数是在请求体中被发送的。 当你通过上面介绍的方法访问这些参数的时候,request 组件会解析这些参数。 你可以通过配置 yiiwebRequest::parsers 属性来自定义怎样解析这些参数。 2.请求方法你可以通过 Yii::$app->request->method 表达式来获取当前请求使用的HTTP方法。 这里还提供了一整套布尔属性用于检测当前请求是某种类型。 例如, request;if ($request->isAjax) { / 该请求是一个 AJAX 请求 / } 3.请求URLsrequest 组件提供了许多方式来检测当前请求的URL。 假设被请求的URL是 http://example.com/admin/index.php/product?id=100, 你可以像下面描述的那样获取URL的各个部分:
4.HTTP头你可以通过 yiiwebRequest::headers 属性返回的 yiiwebHeaderCollection 获取HTTP头信息。 例如, request->headers;// 返回 Accept header 值 if ($headers->has('User-Agent')) { / 这是一个 User-Agent 头 / } 请求组件也提供了支持快速访问常用头的方法,包括:
假如你的应用支持多语言,并且你想在终端用户最喜欢的语言中显示页面,那么你可以使用语言协商方法 yiiwebRequest::getPreferredLanguage()。 这个方法通过 yiiwebRequest::acceptableLanguages 在你的应用中所支持的语言列表里进行比较筛选,返回最适合的语言。 提示:你也可以使用 yiifiltersContentNegotiator 过滤器进行动态确定哪些内容类型和语言应该在响应中使用。 这个过滤器实现了上面介绍的内容协商的属性和方法。 5.客户端信息你可以通过 yiiwebRequest::userHost 和 yiiwebRequest::userIP 分别获取host name和客户机的IP地址, 例如, request->userHost; $userIP = Yii::$app->request->userIP;二、响应(Responses)响应: 当应用完成处理一个请求后,会生成一个yiiwebResponse响应对象并发送给终端用户 响应对象包含的信息有HTTP状态码,HTTP头和主体内容等,网页应用开发的最终目的本质上就是根据不同的请求构建这些响应对象。在大多是情况下主要处理继承自 yiiwebResponse 的 response 应用组件, 尽管如此,Yii也允许你创建你自己的响应对象并发送给终端用户,这方面后续会阐述。 在本节,将会描述如何构建响应和发送给终端用户。 1.状态码构建响应时,最先应做的是标识请求是否成功处理的状态,可通过设置 yiiwebResponse::statusCode 属性,该属性使用一个有效的HTTP 状态码。例如,为标识处理已被处理成功, 可设置状态码为200,如下所示: response->statusCode = 200;尽管如此,大多数情况下不需要明确设置状态码,因为 yiiwebResponse::statusCode 状态码默认为200, 如果需要指定请求失败,可抛出对应的HTTP异常,如下所示: 当错误处理器 捕获到一个异常,会从异常中提取状态码并赋值到响应, 对于上述的 yiiwebNotFoundHttpException 对应HTTP 404状态码,以下为Yii预定义的HTTP异常:
如果想抛出的异常不在如上列表中,可创建一个yiiwebHttpException异常,带上状态码抛出,如下: 2.HTTP 头部可在 response 组件中操控yiiwebResponse::headers来发送HTTP头部信息,例如: response->headers;// 增加一个 Pragma 头,已存在的Pragma 头不会被覆盖。 // 设置一个Pragma 头. 任何已存在的Pragma 头都会被丢弃 // 删除Pragma 头并返回删除的Pragma 头的值到数组 补充: 头名称是大小写敏感的,在yiiwebResponse::send()方法调用前新注册的头信息并不会发送给用户。 3.响应主体大多是响应应有一个主体存放你想要显示给终端用户的内容。 如果已有格式化好的主体字符串,可赋值到响应的yiiwebResponse::content属性,例如: response->content = 'hello world!';如果在发送给终端用户之前需要格式化,应设置 yiiwebResponse::format 和 yiiwebResponse::data 属性,yiiwebResponse::format 属性指定yiiwebResponse::data中数据格式化后的样式,例如: response; $response->format = yiiwebResponse::FORMAT_JSON; $response->data = ['message' => 'hello world'];Yii支持以下可直接使用的格式,每个实现了yiiwebResponseFormatterInterface 类, 可自定义这些格式器或通过配置yiiwebResponse::formatters 属性来增加格式器。
上述响应主体可明确地被设置,但是在大多数情况下是通过 操作 方法的返回值隐式地设置,常用场景如下所示: render('index'); }上述的 index 操作返回 index 视图渲染结果,返回值会被 response 组件格式化后发送给终端用户。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
