处理 HTTP 请求
为了充分利用 CodeIgniter,您需要对 HTTP 请求和响应的工作原理有一个基本的了解。由于这是您在开发 Web 应用程序时所处理的内容,因此了解 HTTP 背后的概念对于所有希望取得成功的开发人员来说是**必须的**。
本章的第一部分将概述这些概念。在介绍完概念之后,我们将讨论如何在 CodeIgniter 中处理请求和响应。
什么是 HTTP?
HTTP 只是一个基于文本的约定,它允许两台机器相互通信。当浏览器请求页面时,它会询问服务器是否可以获取该页面。然后服务器准备页面并将响应发送回请求它的浏览器。就是这样。显然,您可以使用一些复杂的功能,但基本原理非常简单。
HTTP 是用来描述这种交换约定的术语。它代表超文本传输协议。在开发 Web 应用程序时,您的目标始终是了解浏览器正在请求什么,并能够做出适当的响应。
请求
每当客户端(Web 浏览器、智能手机应用程序等)发出请求时,它都会向服务器发送一条简短的文本消息并等待响应。
请求看起来像这样
GET / HTTP/1.1
Host codeigniter.com
Accept: text/html
User-Agent: Chrome/46.0.2490.80
此消息显示了了解客户端请求内容所需的所有信息。它告诉请求的方法(GET、POST、DELETE 等)以及它支持的 HTTP 版本。
请求还包含一些可选的请求头,这些请求头可以包含各种信息,例如客户端希望以什么语言显示内容、客户端接受的格式类型等等。维基百科有一篇文章列出了所有头部字段,如果你想查看的话。
响应
服务器收到请求后,您的应用程序将使用这些信息生成一些输出。服务器将您的输出作为其对客户端的响应的一部分进行捆绑。这也表示为一个简单的文本消息,看起来像这样
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 05 Nov 2015 05:33:22 GMT
Content-Type: text/html; charset=UTF-8
<html>
. . .
</html>
响应告诉客户端它正在使用哪个版本的 HTTP 规范,可能最重要的是状态码 (200)。状态码是一组标准化的代码,对客户端具有非常特定的含义。这可以告诉他们请求成功 (200),或者页面未找到 (404)。前往 IANA 查看HTTP 状态码的完整列表。
处理请求和响应
虽然 PHP 提供了与请求和响应头交互的方式,但 CodeIgniter 与大多数框架一样,对它们进行了抽象,以便您拥有一个一致且简单的接口。 IncomingRequest 类 是 HTTP 请求的面向对象的表示。它提供了您需要的一切
<?php
use CodeIgniter\HTTP\IncomingRequest;
$request = request();
// the URI path being requested (i.e., /about)
$request->getUri()->getPath();
// Retrieve $_GET and $_POST variables
$request->getGet('foo');
$request->getPost('foo');
// Retrieve from $_REQUEST which should include
// both $_GET and $_POST contents
$request->getVar('foo');
// Retrieve JSON from AJAX calls
$request->getJSON();
// Retrieve server variables
$request->getServer('Host');
// Retrieve an HTTP Request header, with case-insensitive names
$request->header('host');
$request->header('Content-Type');
// Checks the HTTP method
$request->is('get');
$request->is('post');
请求类在后台为您做了很多工作,您永远不必担心。 isAJAX()
和 isSecure()
方法检查几种不同的方法以确定正确的答案。
注意
isAJAX()
方法依赖于 X-Requested-With
头部,在某些情况下,它不会在通过 JavaScript (例如,fetch) 的 XHR 请求中默认发送。请参阅AJAX 请求 部分,了解如何避免此问题。
CodeIgniter 还提供了一个 Response 类,它是一个面向对象的 HTTP 响应表示。这为您提供了一种简单而强大的方法来构建对客户端的响应。
<?php
use CodeIgniter\HTTP\Response;
$response = response();
$response->setStatusCode(Response::HTTP_OK);
$response->setBody($output);
$response->setHeader('Content-Type', 'text/html');
$response->noCache();
// Sends the output to the browser
// This is typically handled by the framework
$response->send();
此外,Response 类允许您使用 HTTP 缓存层以获得最佳性能。