处理 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 缓存层以获得最佳性能。