内容协商 (Content Negotiation)
大多数响应包含一个实体,此实体包含人类用户能理解的信息。通常,希望提供给用户相应于请求最容易得到的实体。对服务器和缓存来说,不幸的是,并不是所有的用户都对这个最容易得到的实体有喜好,并且并不是所有的用户代理(如web浏览器)都能一致的呈现这些实体。所以,HTTP提供了一些“内容协商”机制 — 当有多个可得的表现形式的时候,对特定的响应选择最好的表现形式的处理过程。 注意:没有称做“格式协商”(译注:“格式”指的是“媒体类型”)的,因为可替换的表现形式可能会同原来的有相同的媒体类型,只是利用了此媒体类型不同的性质,例如一种不同的语言。 任何包含一个实体主体的响应包括错误响应都可能会受协商的支配。 有两种类型的内容协商在HTTP中:服务器驱动协商和代理驱动协商。这两种类型的协商具有正交性并且能被单独使用或联合使用。一个联合使用方法的协商会被叫做透明协商,当缓存利用代理驱动协商的信息的时候,此代理驱动协商的信息被为后续请求提供服务器驱动协商的源服务器提供。 12.1 服务器驱动协商(Server-driven Negotiation) 如果响应的最好的表现形式的选择是通过服务器上的算法来实现,那么这种方式的协商称做服务器驱动协商。选择是基于响应可得的表现形式(根据不同的维度,响应会不同;例如,语言,内容编码,等等)和请求消息里特定的头域或关于请求的其他信息(如:网络客户端的地址)。 服务器驱动协商是有优点的,当从可行的表现形式里进行选择的算法对用户代理进行描述是比较困难的时候(译注:代理驱动协商),或者当服务器期望发送“最好的猜测”给客户端而只通过一个响应(以避免后续请求的回路(一个请求会返回一个响应)延迟如果此“最好的猜测“对用户适合的时候)的时候。为了改善服务器的猜测,用户代理应该包含请求头域(Accept,Accept-Language,Accept-Encoding,等等),这些头域能描述它对响应的喜好。 服务驱动协商有如下缺点: 1. 对服务器不可能确切的决定对用户来说什么是最好的,因为那需要对用户代理和用户对此响应目的的全面理解(如:用户到底想把响应展示到屏幕还是打印到纸上?)。 2. 使用户代理描述请求里的能力是非常无效的(假设只有响应的一小部分有多个表现形式)还有会侵犯用户的隐私。 3. 使源服务器的实现变得复杂,也对为请求产生响应的算法实现变得复杂。 4. 可能会限制公有缓存(public cache)为多个客户请求利用相同响应的能力 HTTP/1.1包含下面的请求头域来使服务器驱动协商启动,这些请求头域描述了用户代理的能力和用户喜好:Accept(14.1节),Accept-Charset(14.2节),Accept-Encoding(14.3节),Accept-Language(14.4节),和User-Agent(14.43节)。然而,一些源服务器并不只局限于这些维度,这些服务器能基于请求的任何方面来让响应不同,这些方面包括请求头域之外的信息或在此规范里没有定义的扩展头域。 Vary头域能被用来表达服务器选择表现形式(representation)利用的参数,表现形式受服务器驱动协商的支配。见14.44节描述了Vary头域如何被服务器的使用,13.6节描述了Vary头域被缓存的使用。 12.2 代理驱动协商 (Agent-driven Negotiation) 对代理驱动协商来说,响应的最好表现形式的选择被用户代理执行,这在接收到源服务器一个初始的响应后。选择是基于响应的一系列可得的表现形式,这些表现形式被包含在初始响应的头域或初始响应的实体主体(entity-body)里,每个表现形式被一个属于自己的URI指定。从这些表现形式中选择可能被自动执行(如果用户代理有能力这样做)或者被用户从超文本连接菜单中手工选择。 代理驱动协商是有优点的,当响应可能会根据一般用途的维度(如:类型,语义,编码)而不同的时候,当源服务器不能通过查看请求而判定用户代理能力的时候,当共有缓存(public cache)被用来分派服务器的承载和减少网络使用的时候。 代理驱动协商也同样存在需要第二次请求而获得最好表现形式的缺点。第二次请求只有当缓存被使用时才是有效率的。另外,此规范没有定义用户代理自动选择表现形式的机制,所以不能防止任何这样的机制被用于HTTP/1.1 HTTP/1.1定义了300(多个选择)和406(不接受的)状态响应,当使用代理驱动协商时服务器不能或不愿意利用服务器驱动协商来提供一个不同的响应的是时候。 12.3 透明协商(Transparent Negotiation) 透明协商是服务器驱动协商和代理驱动协商的结合体。当一个缓存被提供了构成响应的一系列可得的表现形式(就像在代理驱动协商里的响应一样)并且维度的差异能完全被缓存理解,那么此缓存变得有能力代表源服务器为那个资源的后续请求去执行服务器驱动协商。 透明协商的优点在于它能分发源服务器的协商工作并且能移去代理驱动协商的第二次请求的延迟,因为缓存能正确的猜测到合适的响应。 此规范没有定义透明协商的机制,所以,它不能防止任何这样的机制被用于HTTP/1.1。 |
相关文章:

[经验]无线鼠标和无线键盘真的不能用了?——雷柏的重生之路~
逆天大二的时候托朋友买了个雷柏的无线键盘鼠标: 用了很多年,不仅外观好而且键盘鼠标本身也很好用,可前些日子就光荣牺牲了。。。。 逆天百思不得其"姐",试着把电池换了,发现还是不行,࿰…

数字化探索:建立学习型组织,HR 也能驱动业务营收?
本篇文章暨 CSDN《中国 101 计划》系列数字化转型场景之一。 《中国 101 计划——探索企业数字化发展新生态》为 CSDN 联合《新程序员》、GitCode.net 开源代码仓共同策划推出的系列活动,寻访一百零一个数字化转型场景,聚合呈现并开通评选通道࿰…

26期20180716 iptables规则备份恢复 firewalld zone
7月16日任务10.19 iptables规则备份和恢复10.20 firewalld的9个zone10.21 firewalld关于zone的操作10.22 firewalld关于service的操作iptables的规则备份和恢复service iptables save会把配置保存到配置文件中 /etc/sysconfig/iptables如果不想保存在这 可以使用iptables-save …

一口气用 Python 写了13个小游戏,摸鱼达人!
来源 | Python小二1、吃金币源码分享:import os import cfg import sys import pygame import random from modules import *游戏初始化 def initGame():# 初始化pygame, 设置展示窗口pygame.init()screen pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.…

关于URL编码
参考:前端工程师的编码遭遇战http://ued.taobao.com/blog/2011/08/26/encode-war/細 談 URL 編碼关于URL编码作者: 阮一峰日期: 2010年2月11日一、问题的由来URL就是网址,只要上网,就一定会用到。一般来说,…

【设计模式】享元模式
上周代码评审,看到同事使用了“享元模式”。想起自己也不懂,着手学习之。 参考的优秀的文章: Java的享元模式 这篇博文为学习之理解、感悟,如理解不真确,请慷慨指出。 本文只讨论单纯享元模式。 Flyweight,…

用D3.js 十分钟实现字符跳动效果
用D3.js 十分钟实现字符跳动效果 注 本文基于 D3.js 作者 Mike Bostock 的 例子原文分为三部分, 在这里笔者将其整合为了一篇方便阅读. 该效果基于 D3.js, 主要使用到了 d3-selection. 如果对d3-selection的基本使用逻辑不太清楚可以参见 这篇文章. 效果图 Step1 首先代码会随机…

HTTP中的缓存
HTTP典型应用于能通过采用缓存技术而提高性能的分布式信息系统。HTTP/1.1协议包括的许多使缓存尽可能的工作的元素。因为这些元素与协议的其他方面有着千丝万缕的联系,而且他们相互作用、影响,因此有必要单独的来介绍基本的缓存设计。如果缓存不能改善性…

Pandas 多层级索引的数据分析案例,超干货!
作者 | 俊欣来源 | 关于数据分析与可视化今天我们来聊一下Pandas当中的数据集中带有多重索引的数据分析实战通常我们接触比较多的是单层索引(左图),而多级索引也就意味着数据集当中的行索引有多个层级(右图)࿰…

Angular - - $sce 和 $sceDelegate
$sce $sce 服务是AngularJs提供的一种严格上下文转义服务。 严格的上下文转义服务 严格的上下文转义(SCE)是一种需要在一定的语境中导致AngularJS绑定值被标记为安全使用语境的模式。由用户通过ng-bind-html绑定任意HTML语句就是这方面的一个例子。我们称这些上下文转义为特权或…

Varnish 和 Squid比较到底强多少
对于坊间流传的:1.varnish的性能比squid高10~20倍2.squid 3.0的性能比2.6有提高本次测试将会揭示结果,是否varnish的架构真的能提升那么多的性能是否squid的新版本在性能上有所提升测试中将不对平台.软件.等等进行优化由于优化水平的关系将极大的影响结果.此次测试中的数据可以…

太强了,Python 开发桌面小工具,让代码替我们干重复的工作~
作者 | Cherish 来源 | 杰哥的IT之旅 决定写这篇文章的初衷是来源于一位小伙伴的问题,关于"如何根据数据源用 Python 自动生成透视表",这个问题背后有个非常好的解决思路,让代码替我们做重复的工作,从而减轻工作量&…

Windows 2008
Windows2008系统实现多用户登录 https://help.aliyun.com/knowledge_detail/6530052.html?spm5176.7618386.5.1.RTfIVT#Windows2008系统实现多用户登录 ECS Windows2008如何支持用户多会话登入 https://help.aliyun.com/knowledge_detail/6511066.html?spm5176.7618386.5.1.f…

java 复制对象有哪些方式
2019独角兽企业重金招聘Python工程师标准>>> java 复制对象有哪些方式 Apache的 Common beanutils库 org.apache.commons.beanutils.BeanUtils.copyProperties(dest,origin);Springframework 的BeanUtil 依赖: <dependency><groupId>org.springframewor…

mysql常用语句集锦
mysql UNIX时间戳与日期的相互转换 UNIX时间戳转换为日期用函数: FROM_UNIXTIME() select FROM_UNIXTIME(1156219870); 日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP() Select UNIX_TIMESTAMP(’2006-11-04 12:23:00′); 例:mysql查询当天的记…

iOS15.4 来袭:新增“男妈妈”表情及口罩面容解锁、AirTags 反跟踪等新功能
整理 | 章雨铭 责编 | 屠敏出品 | CSDN(ID:CSDNnews)今日,苹果发布了iOS/iPadOS 15.4正式版。该版本带来了一些重大新功能的更新,包括在戴口罩时使用Face ID功能,以及一些新的表情符号和Siri语音更新…

symfony2项目访问app_dev.php不显示debug工具栏的问题
2019独角兽企业重金招聘Python工程师标准>>> 当在symfony2中比如添加一个bundle后,访问app_dev.php时不会显示底部debug工具栏,一种情况是模板中没有包含有效的html标签 参考:http://stackoverflow.com/questions/10399089/symfon…

PHP的Smarty
原理:把模板文件编译成php文件,然后每次都去读取下模板的修改时间,没有修改就不编译。然后include这个“编译”后的PHP文件。所谓编译也就是模板用正则替换成含PHP代码的过程。实际上并不会每次请求都编译,所以性能尚可。而SMARTY…

真香!精心整理了 100+Python 字符串常用操作
来源丨萝卜大杂烩作者丨周萝卜字符串作为平时使用最多的数据类型,其常用的操作我们还是很有必要熟记于心的,本文整理了多种字符串的操作的案例,还是非常用心,记得点赞收藏~字符串切片操作test "Python Programming" pr…

IOS版添加phonegap-视频播放插件教程
2019独角兽企业重金招聘Python工程师标准>>> 插件集成过程:1.配置Target链接参数选择 Build Settings | Linking | Other Linker Flags, 将该选项的 Debug/Release 键都配置为-ObjC。2.Vitamio SDK 依赖的系统框架和系统库如下:– AVFoundation.framwork…

C#线程同步的几种方法
在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳。 一、volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的。它只能在变量一级做同步,volatile的含义就是告诉处理器…

ecshop模板的原理分析
模板的原理 类似Smarty/ECShop这类模板的原理如下图所示。1.首先是编译模板ECShop/Smart是利用PHP引擎,所以编译的结果是一个PHP文件,其编译过程就是将分隔符{}替换成PHP的标准分隔符<?PHP ?>,将$var替换成 echo $var; 或者print $va…

Python 快速生成 web 动态展示机器学习项目!
来源丨网络作者丨wedo实验君1. Streamlit一句话,Streamlit是一个可以用python编写web app的库,可以方便的动态展示你的机器学习的项目。优点你不需要懂html, css, js等,纯python语言编写web app包括web常用组件&#x…

Linux-CentOS 7 增加root分区容量
今天搭建了一台CentOS 7 的机器,搭建完成后通过【df -lh】看了一下分区大小,root分区太小了。 分区.png打算把home分区的容量分一部分给root,具体操作步骤如下: 备份home分区cp -r /home/ homebak卸载【home】目录umount /home/现…

PHP数组实际占用内存大小的分析
http://blog.csdn.net/hguisu/article/details/7376705我们在前面的php高效写法提到,尽量不要复制变量,特别是数组。一般来说,PHP数组的内存利用率只有 1/10, 也就是说,一个在C语言里面100M 内存的数组,在PHP里面就要1…

肝货,详解 tkinter 图形化界面制作流程!
作者 | 黄伟呢来源 | 数据分析与统计学之美本期案例是带着大家制作一个属于自己的GUI图形化界面—>用于设计签名的哦(效果如下图),是不是感觉很好玩,是不是很想学习呢?限于篇幅,今天我们首先详细讲述一下Tkinter的使用方法。tk…

迁移碰到数据库 Unknown collation: 'utf8mb4_unicode_ci'
数据库从香港服务器迁移到阿里云的虚拟主机,不得不吐槽一下。阿里云的ftp好慢,db导入面板也不够友好。 还得靠中断命令行链接,结果版本太低不支持 utf8mb4_unicode_ci,尼玛,现在都mysql5.7了,您还在 5.1时代…

15-shell 输入/输出重定向
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是…

高性能Mysql主从架构的复制原理及配置详解
1 复制概述Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复…

gdal 1.9+python 2.7开发环境配置
最近项目使用Cesium平台基于WegGl做web地球,其中关于地形数据有一种支持格式为terrain的地形数据。这种格式可以通过一个python工具切dem来得到。 下面记录下配置gdalpython开发环境,系统是win7 64位,不过gdal和python是32位的,没…