「2014-3-11」HTTP 初步探究
网络上存在很多资源,也持续不断地生成新的资源。为了新建、获取和操作这些资源,引来了两个问题:如何定位资源,如何对他们进行操作。第一个问题引申出了 URI / URL 即 uniform resource identifier / locator,第二个问题则引申出了 HTTP 超文本传输协议。(刚接触 HTTP 不足一礼拜,所以,从这里往下,极可能存在一些错误和理解偏差,单纯个人记录,勿引用)
HTTP 是基于 TCP 传输层协议的一种应用层协议,是 connection oriented 然而无状态(stateless)的一种协议。归根结底,其目的,《A Beginner's Guide to HTTP and REST》将其概括为「The HTTP client and HTTP server exchange information about resources identified by URLs.」
对于资源的增删查改,分别对应于 PUT DELETE GET POST 四种基本的 HTTP 操作,其中最为常用的,则是 GET 和 POST,而这两种操作的本质区别,则在于是否 idempotent 即多次重复操作不会引发多次实际的资源变更(具体可参考《HTTP POST GET 本质区别详解》、《GET vs POST: Don't Mis-Use It Now》、《HTML 表单》,第二篇文章里提到了 google 爬虫开始处理表单的问题,更进一步表明不可在本该使用 POST 的地方使用 GET,否则会引起麻烦),细节层面的区别则包括诸如 form content type 之类的问题。
下面给两个例子,都是通过 GET 直接获取指定 URL 所标定的资源,如:
# http://www.baidu.com/img/bdlogo.gif - 读取百度的 logo 图片。
# https://www.google.com/search?newwindow=1&q=stackoverflow - 在 Google 里获取 stackoverflow 相关的索引条目。
由于 HTTP 是无状态的一种协议,所以面对诸如「记住登陆状态」、「记住上次访问这个网页时设定的背景颜色」的需求,就需要在 client-side 设计一种机制,能够存储某些状态。于是催生了 cookie 这种东东。
cookie 记录了用户的一些隐私,需要得到保护;浏览器引入了 domain 的概念,规范和限制前端 Javascript 对 cookie 的获取和操作权限(仅有生成该 cookie 的 HOST domain 能够读取并操作该 cookie)。
然而,某些场景里,如单点登录(single sign-on),希望能够跨域访问 cookie,所以催生了一系列实用手段如《新浪微博如何实现 SSO 分析》,以及 P3P (the Platform for Privacy Preferences) 约定用于保护用户隐私的协议(参考搜狐武汉研发中心企业邮箱团队成员 qyb 的单点登录文章、香港某 CDN 团队成员的博客),还有 stackoverflow 一则已经锁定的 community wiki 帖子《How do I send a cross-domain POST request via JavaScript?》(未细读 #mark#)。
P.S.
其他东东备份(这几天看 HTTP 顺带看了些 web 相关的其他东西,颇有刘姥姥进大观园的惊奇感…… 囧):
## 《HTTP Made Really Easy - A Practical Guide to Writing Clients and Servers》,极好的文章。
## 《HTTP keep-alive 模式》即传输层使用长连接模式,避免反复建立和断开连接所增加的开销。使用 Content-Length 或者 Transfer-Encoding: chunkded(有点类似于 Intel extended HEX 格式)来确定单个 HTTP 响应的长度。
## 《HTTP 协议详解》,其实不够详解,但是图文并茂(大量 Fiddler 抓包截图),很不错。
## XSS (Cross site scripting) 跨域脚本攻击科普文:http://www.houbysoft.com/v/en/papers/xss/。
## 两则 HTTP cookie and XSS wikipedia 链接,信息量很大,未细看。#mark#
## session cookies vs. persistent cookies - 如果没有设定 expiration date 则属于 session cookie(这个站点都是和 cookie 相关的信息)。
## 《REST : PUT or POST》,依然是 idempotent 的问题。
## 《Learn REST: A Tutorial》系列文章和 FAQ(填坑专用)。未读完,没细看。#mark#
## 如何通过 Python urllib2 or requests 库编写搜索引擎爬虫 && 如何记住 cookie 留待以后使用,有道云笔记链接。
## HTTP proxy 相关的笔记链接,其中提到了 HAProxy 以及其作者提出的 proxy protocol 和 stackoverflow 问答里提到的 HTTP 1.1 RFC 2616 和 SNMP applications RFC 3413(Command Generators, Command Responders, Notification Originators, Notification Receivers, and Proxy Forwarders)。似乎每个主题展开都是极其庞大…… #mark#
「2014-3-11」HTTP 初步探究的更多相关文章
- redis-4.0.11主从配置初步探究
redis-4.0.11相较于以前版本,新增了几个安全措施,稍稍研究了6379.conf配置文件,在这里记录一下. 实验环境: centos7.4 redis:redis-4.0.11 1. redi ...
- LOJ# 572. 「LibreOJ Round #11」Misaka Network 与求和(min25筛,杜教筛,莫比乌斯反演)
题意 求 \[ \sum_{i = 1}^{n} \sum_{i = 1}^{n} f(\gcd(i, j))^k \pmod {2^{32}} \] 其中 \(f(x)\) 为 \(x\) 的次大质 ...
- LOJ 572 「LibreOJ Round #11」Misaka Network 与求和——min_25筛
题目:https://loj.ac/problem/572 莫比乌斯反演得 \( ans=\sum\limits_{D=1}^{n}\left\lfloor\frac{n}{D}\right\rflo ...
- Loj#572. 「LibreOJ Round #11」Misaka Network 与求和
题目 有生之年我竟然能\(A\) 这个题求的是这个 \[\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))^k\] \(f(i)\)定义为\(i\)的次大质因子,其中\(f(p)= ...
- LOJ572. 「LibreOJ Round #11」Misaka Network 与求和 [莫比乌斯反演,杜教筛,min_25筛]
传送门 思路 (以下令\(F(n)=f(n)^k\)) 首先肯定要莫比乌斯反演,那么可以推出: \[ ans=\sum_{T=1}^n \lfloor\frac n T\rfloor^2\sum_{d ...
- 「C++11」Lambda 表达式
维基百科上面对于 lambda 的引入是如下描述的: 在标准 C++,特别是当使用 C++ 标准程序库算法函数诸如 sort 和 find.用户经常希望能够在算法函数调用的附近定义一个临时的述部函数( ...
- loj #6250. 「CodePlus 2017 11 月赛」找爸爸
#6250. 「CodePlus 2017 11 月赛」找爸爸 题目描述 小 A 最近一直在找自己的爸爸,用什么办法呢,就是 DNA 比对. 小 A 有一套自己的 DNA 序列比较方法,其最终目标是最 ...
- 「P4994」「洛谷11月月赛」 终于结束的起点(枚举
题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...
- 「Python实用秘技11」在Python中利用ItsDangerous快捷实现数据加密
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第11 ...
随机推荐
- WPF自适应窗体实现小结
WPF自适应窗体实现小结 这几天,因工作需要,要对一个小软件进行UI调整.主要内容就是让其能够实现自适应窗体(包括文字和图标),做成像WIN7下的Media Center一样的UI.自适应窗体,顾名思 ...
- 配置FastReport,FastReport报表加载不出来
插件链接: Demo地址:http://pan.baidu.com/s/1dEXUvsP FastReport.Net软件地址:https://pan.baidu.com/s/1c2kNBVi ...
- 利用JDK(1.6及以上版本)创建WebService
一.什么是WebService WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络 ...
- Git基础知识与常用命令
一:相关概念: 1:工作区(Working Directory): 就是你在电脑里能看到的目录 2:版本库(Repository): 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库. ...
- GO_order
Gpos Q8RP81 有GO:0000015 P47437 有GO:0000049 P06535 有GO:0000155 Q99027 有GO:0000160 P35594 有GO:0000166 ...
- 修改页面JS 360浏览器
javascript:document.body.contentEditable='true'; document.designMode='on'; void 0
- sql删除前导和后缀
1.patindex用法 patindex('%pattern%', expression) pattern--> 正则表达式,需要匹配的前导内容,可以进通配: expression--> ...
- MVC中获取模型属性的Range和StringLength验证特性设置
MVC中的客户端及服务端模型验证信息都以ModelMetadata类型作为承载,在获得属性的ModelMetadata之后(还不知道怎么获取ModelMetadata的童鞋请自行恶补),我们可以轻松得 ...
- bootstrap表格内容跑到表格外面的处理办法
http://stackoverflow.com/questions/21587813/bootstrap-responsive-table-content-wrapping td写下这个样式即可.& ...
- Java常用的7大排序算法汇总
1.插入排序算法 插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过 ...