codecamp

CodeIgniter4 处理HTTP请求

为了充分地使用 CodeIgniter,你需要对 HTTP 请求和响应的工作方式有基本的了解。因为在开发Web应用时需要处理 HTTP 请求,所以对于所有想要成功的开发者来说, 理解 HTTP 背后的概念是 必须 的。

本章的第一部分会给出一些关于 HTTP 的概述,接着我们会讨论怎样用 CodeIgniter 来处理 HTTP 请求与响应。

什么是 HTTP ?

HTTP 是两台计算机相互通信的一种基于文本的协议。当浏览器请求页面时,它会询问服务器是否可以获取该页面。然后, 服务器准备页面并将响应发送回发送请求的浏览器。就是这样简单,也可以说复杂些,但基本就是这样。

HTTP 是用于描述该交换约定的术语。它代表超文本传输协议(Hypertext Transfer Protocol)。开发 web 应用程序时, 你的目标只是了解浏览器的要求,并能够做出适当的响应。

HTTP 请求

当客户端(浏览器,手机软件等)尝试发送 HTTP 请求时,客户端会向服务器发出一条文本消息然后等待响应。

这条文本消息会像这样:

GET / HTTP/1.1
Host codeigniter.com
Accept: text/html
User-Agent: Chrome/46.0.2490.80

这条消息包含了所有服务器可能需要的信息。比如它请求的 method(GET,POST,DELETE 等)、它所支持的 HTTP 版本。

该请求还包括许多可选的请求头字段,这些头字段可以包含各种信息,例如客户端希望内容显示为哪种语言, 客户端接受的格式类型等等。 Wikipedia 上有一篇文章,列出了所有的请求头字段(译者注:国内用户如果无法访问的话, 可以查看 在MDN上的页面 )。

HTTP 响应

服务器收到请求后,你的 web 应用程序会处理这条信息然后输出一些响应结果。服务器会将你的响应结果打包为对 客户端的的你的响应结果打包为对客户端的响应的一部分。服务器对客户端的响应消息看起来会像这样:

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 提供了与 HTTP 请求和响应进行交互的原生方式,但 CodeIgniter 像大多数框架一样,将它们抽象化,让你拥有一个 一致、简单的接口。IncomingRequest 类 类是 HTTP 请求的面向对象的表示形式。 它提供你所需要的一切:

use CodeIgniter\HTTP\IncomingRequest;


$request = service('request');


// 请求的 uri(如 /about )
$request->uri->getPath();


// 检索 $_GET 与 $_POST 变量
$request->getGet('foo');
$request->getPost('foo');


// 从 $_REQUEST 检索,其中应同时包含 $_GET 和 $_POST 内容
$request->getVar('foo');


// 从 AJAX 调用中检索 JSON
$request->getJSON();


// 检索 server 变量
$request->getServer('Host');


// 检索 HTTP 请求头,使用不区分大小写的名称
$request->getHeader('host');
$request->getHeader('Content-Type');


$request->getMethod();  // GET, POST, PUT 等等

request 类会在后台为你做很多工作,你无需担心。 isAJAX()isSecure() 函数会自动检查几种不同的 method 来 最后确定正确的答案。

注解

isAJAX() 函数依赖于 X-Requested-With 头部,这个头部在一些情况下,不会在 XHR 请求中通过 JavaScript 默认发送。想要了解如何避免这个问题,请参考 AJAX Requests 章节

CodeIgniter 还提供了 Response 类 ,它是 HTTP 响应的面向对象式表示。 它为你提供一种简单而强大的方法来构造对客户的响应:

use CodeIgniter\HTTP\Response;


$response = service('response');


$response->setStatusCode(Response::HTTP_OK);
$response->setBody($output);
$response->setHeader('Content-type', 'text/html');
$response->noCache();


// 把响应结果发给浏览器
$response->send();

另外, Response 类 还允许你处理 HTTP 缓存层以获得最佳性能。

CodeIgniter4 服务
CodeIgniter4 安全指南
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }