资讯专栏INFORMATION COLUMN

CodeIgniter 4 的内容协商

CarlBenjamin / 2968人阅读

摘要:然而事实上服务器可以帮我们处理某些形式的内容协商,我们通常不太善于利用这一点,但并不意味着服务器不能处理这些信息。但如果你想用,那在中使用内容协商也是很容易的。

当我关注到 HTTP 层的时候,发现很多 CIer 对内容协商还不是很了解,下面我们一起来探讨一下什么是内容协商,以及如何在即将到来的 CodeIgniter 4 中使用他。

什么是内容协商?

简而言之,内容协商是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、图片类型和编码方式等作为判断的基准(包含在请求头中的某些 Accept 字段就是判断的基准)。

举个例子,我用 Chrome 访问 Mozilla 的站点,可以看到下面的 HTTP 请求头信息:

accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

accept-encoding:gzip, deflate, sdch

accept-language:en-US,en;q=0.8

这些 accept 信息告诉我们浏览器所支持的格式,并提供这些格式的优先级信息(通过 q 的值来确定优先级)。以上信息说明浏览器在所有支持的内容类型中更希望接收 text/html 类型的内容。由于我的浏览器的语言设置是英语,所以 accept-language 请求头表示我更喜欢美式英语(en-US)的页面。

很显然,即使我们不提供任何内容协商信息,Web 站点还是可以照常运行,并且我们已经这样做了很多年。然而事实上 Web 服务器可以帮我们处理某些形式的内容协商,我们通常不太善于利用这一点,但并不意味着服务器不能处理这些信息。

内容协商有两个很吸引人的用处,一个是用于那些支持多国语言的站点,另一个是用于返回特定格式数据的 API 接口。

是不是必须要使用内容协商呢?可能不一定,他也许是把双刃剑,有些人提议不要使用他,也有些人认为他就像切片面包一样令人喜爱。但如果你想用,那在 CodeIgniter 中使用内容协商也是很容易的。

一个简单的例子

这里我不会对内容协商作过多详细的介绍(详细介绍将写到用户手册中),这个例子简单介绍了内容协商是如何确定输出语言的。

class BaseController extends CodeIgniterController
{
    protected $language;

    public function __construct(...$params)
    {
        parent::__construct(...$params);

        $supportedLangs = ["en-US", "en", "fr"];

        $this->language = $this->request->negotiate("language", $supportedLangs);
    }
}

这个例子表示该站点可以支持英语和法语,我们将支持的语言赋值到 $supportedLangs 数组里,预示着默认语言是美式英语,但也支持普通英语和法语,然后简单调用 $negotiate->language() 方法,传递支持的语言类型,解析时就能识别正确的 HTTP 头,然后按照数组里定义的优先级顺序,返回最匹配的结果。如果两种语言都无法匹配,就会使用数组中的第一个语言。

Negotiate 类中的 4 个协商方法分别为:

media() 不同于通常的 Accept 请求头,他可以用来请求不同版本的 html/text,或者音频支持,图像支持,等等。

charset() 不同于 Accept-Charset 请求头,如果没有匹配的话,默认值为 UTF-8。

encoding() 不同于 Accept-Encoding 请求头,可以决定任何客户端支持使用的压缩类型。

language() 不同于 Accept-Language 请求头。

并不是所有场景都用得着内容协商,但他却是构建高质量 API 的一个有力工具,并且也能够创造性的应用于其他地方。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21514.html

相关文章

  • CodeIgniter 4 请求和响应

    摘要:在版中,我们将更加模块化层,并构建全新的类结构来同时处理的请求和响应。类类用于把程序的执行结果返回给客户端。类会捕获控制器的输出,并自动设置为响应的主体。在需要的时候,框架为你提供了精确控制响应的能力。 CodeIgniter 4 对输入和输出的处理方式做了一个较大的改变。在上一个版本中,包括最新的 V3 版,输入和输出分别是用两个包含相关函数的类来处理的。这样的处理方式背后虽然没有什...

    zzzmh 评论0 收藏0
  • Codeigniter 4.0-dev 版源码学习笔记之三——核心文件 Codeigniter.ph

    摘要:行,是否强制访问。行,尝试处理此次请求,详细见方法。至此,的执行主流程完毕。小结是的核心文件,它被调用后,完成了诸多的主流程操作。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 前言 Codeigniter.php 是 CI 4 的核心所在,在这里接收并处理了 request 请求,安全检查,缓存处理, URL 解析以及路由匹配,执行过滤器,加载运行 Controll...

    alighters 评论0 收藏0
  • 现在写 PHP,你应该知道这些

    摘要:首先你应该是在用以上的版本,如果版本在这之下,是时候该升级了。按照其官网的说法,这个组织的目的并不是告诉你你应该怎么做,只是一些主流的框架之间相互协商和约定。和没有出现在以上的列表中,是因为还没有投票通过。不要被这些话所困扰。 首先你应该是在用 PHP 5.3 以上的版本,如果 PHP 版本在这之下,是时候该升级了。我建议如果有条件,最好使用最新的版本。 你应该看过 PHP The R...

    supernavy 评论0 收藏0
  • PHP 框架 CodeIgniter 4 alpha 1 版发布了

    摘要:经过漫长的艰苦奋斗,版今天终于发布了。该版本具备所有主要功能,但仍存在一些问题。认为缺少什么在论坛中发布帖子。我们将很快在论坛启动候选新功能的工作,我们将从论坛中选出有价值的内容你使用该版本时遇到的问题在论坛中发布帖子。 经过漫长的艰苦奋斗,CodeIgnier 4.0.0 alpha 1 版今天终于发布了。 向 Lonnie Ezell 致敬!感谢他为实现愿景和核心实施所做的所有努力...

    james 评论0 收藏0
  • Codeigniter 4.0-dev 版源码学习笔记之四——详细路由过程

    摘要:行,判断如果为空,那么返回默认路由。行,把处理完毕后找到的返回。方法该方法是自动按着约定规则去目录去找路由的过程。此文可以转载,但转载前需要发邮件到进行沟通,未沟通的均视作侵权。 前言 我个人觉得在当前 MVC 流行的架构下,要想去了解一个框架,或者是一个基于此架构下的应用程序,最好的入手方式就是先看路由,虽然路由不是 MVC 里的任何一个,但是知道了路由的来龙去脉就知道了整个框架或者...

    NSFish 评论0 收藏0

发表评论

0条评论

CarlBenjamin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<