网络上存在很多资源,也持续不断地生成新的资源。为了新建、获取和操作这些资源,引来了两个问题:如何定位资源,如何对他们进行操作。第一个问题引申出了 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 初步探究的更多相关文章

  1. redis-4.0.11主从配置初步探究

    redis-4.0.11相较于以前版本,新增了几个安全措施,稍稍研究了6379.conf配置文件,在这里记录一下. 实验环境: centos7.4 redis:redis-4.0.11 1. redi ...

  2. 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\) 的次大质 ...

  3. 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 ...

  4. 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)= ...

  5. 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 ...

  6. 「C++11」Lambda 表达式

    维基百科上面对于 lambda 的引入是如下描述的: 在标准 C++,特别是当使用 C++ 标准程序库算法函数诸如 sort 和 find.用户经常希望能够在算法函数调用的附近定义一个临时的述部函数( ...

  7. loj #6250. 「CodePlus 2017 11 月赛」找爸爸

    #6250. 「CodePlus 2017 11 月赛」找爸爸 题目描述 小 A 最近一直在找自己的爸爸,用什么办法呢,就是 DNA 比对. 小 A 有一套自己的 DNA 序列比较方法,其最终目标是最 ...

  8. 「P4994」「洛谷11月月赛」 终于结束的起点(枚举

    题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...

  9. 「Python实用秘技11」在Python中利用ItsDangerous快捷实现数据加密

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第11 ...

随机推荐

  1. quartz_job

    quartz--job job是执行任务所需的Java类. 在quartz中job分为两种,有状态和无状态的.job是无状态的,statefuljob是有状态的. 通过实现job或者statefulj ...

  2. C++对象模型

    1.类布局 1.1简单类对象的内存布局 class A { public: void f(); private: int i; char c; static int s; }; 简单对象的内存布局:非 ...

  3. smarty 内存缓存

    <?php //缓存 //定义一个该页面的缓存文件路径 $filename="../cache/mainhc.html"; //设置一个缓存时间 $time=; //判断缓存 ...

  4. C#读写XML

    1.根据xml格式的string生成xml文件并保存到本地 /// <summary> /// 保存XML到磁盘 /// </summary> /// <param na ...

  5. PTA Insertion or Heap Sort

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

  6. ASP.NET ZERO 学习 HangFire的使用二

    之前在ABP配置好了HangFire环境之后,那么如何才能添加Job到HangFire中让其执行呢 这就需要参考ABP的Background Jobs and Workers, 参考路径:http:/ ...

  7. linux下添加链接与删除链接(ln命令的用法)

    添加链接使用ln命令用法:#ln --help用法:ln [选项]... 目标 [链接名]或:ln [选项]... 目标... 目录或:ln [选项]... --target-directory=目录 ...

  8. Centos实现回收站机制

    作为一个运维人员,在服务器上删除文件时为了方便经常会直接使用rm *.txt这类通配符,甚至为了省事加-rf参数,如果是确定的话还好,要是在删除的时候一个不留神,那事可就大了. 俗话说常在河边站哪有不 ...

  9. [goa]golang微服务框架学习(二)-- 代码自动生成

    之前用过go语言的反射来做一些代码生成,参考这篇. 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子,先看 ...

  10. JS产生随机数

    <script>   function GetRandomNum(Min,Max){   var Range = Max - Min;   var Rand = Math.random() ...