一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据。
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。比如 GET /data/info.html HTTP/1.1
方法字段就是HTTP使用的请求方法,比如常见的GET/POST
HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者 POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说 Content-Length必须出现。
常见的请求头字段含义:
它的作用是通过一个空行,告诉服务器请求头部到此为止。
若方法字段是GET,则此项为空,没有数据
若方法字段是POST,则通常来说此处放置的就是要提交的数据
同样的,HTTP响应报文也由三部分组成:响应行、响应头、响应体
响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK
其中协议版本HTTP/1.1或者HTTP/1.0,200就是它的状态码,OK则为它的描述。
常见状态码:
响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。
设置HTTP响应头往往和状态码结合起来。例如,有好几个表示“文档位置已经改变”的状态代码都伴随着一个Location头,而401(Unauthorized)状态代码则必须伴随一个WWW-Authenticate头。然而,即使在没有设置特殊含义的状态代码时,指定应答头也是很有用的。应答头可以用来完成:设置Cookie,指定修改日期,指示浏览器按照指定的间隔刷新页面,声明文档的长度以便利用持久HTTP连接,……等等许多其他任务。
响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。
REST – Representational State Transfer 直接翻译:表现层状态转移。
所谓REST就是用URL定位资源,用HTTP描述操作。
答:RPC的话很多不是资源,而是操作,例如/DeleteOrder/GetOrder?id=1
REST中URI使用名词而不是动词,且推荐用复数。,例如/DeleteOrder/orders/1
-(1)每一个URI代表一种资源;
-(2)客户端和服务器之间,传递这种资源的某种表现层(Representation);
-(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
-Jersey API、HttpURLConnection、HttpClient、JAX-RS API、webClient
客户端 向 服务器TCP层 发送一个请求 FIN
服务器 收到了 服务器 发送的 FIN ,返回 FIN 和 ACk,表示收到了 客户端的请求
客户端 收到 服务器返回的数据 后再次发送 ACk,和服务器建立了链接
客户端 发送 数据给服务器,服务器收到了,返回给客户端一个 ACK
客户端 发送 数据给服务器,服务器收到了,返回给客户端一个 ACK
一个对象被创建或拷贝时计数加1,当引用变量被销毁时减1,当计数为0时,该对象会被清除
优点:操作简单,实时性能优秀,能在最短时间内获得并运算对象引用数
缺点:内存负担加重,会造成常驻内存的情况
通过根节点判断对象是否可达,将不可达部分清除
以空间换取时间效率。python为了提高程序执行效率,将垃圾回收机制进行了阀值限定。第0代中的垃圾回收机制执行最为密集,其次是第1代,最后是第2代
Py3.0 运行 pystone benchmark 的速度比 Py2.5 慢 30%。 Guido 认为 Py3.0 有极大的优化空间, 在字符串和整形操作上可以取得很好的优化结果。Py3.1 性能比 Py2.5 慢 15%, 还有很大的提升空间。
Py3.X 源码文件默认使用 utf-8 编码
1) 去除了<>,全部改用!=
2) 去除``,全部改用 repr()
3) 关键词加入 as 和 with,还有True,False,None
4) 整型除法返回浮点数,要得到整型结果,请使用//
5) 加入 nonlocal 语句。使用noclocal x可以直接指派外围(非全局)变量
6) 去除 print 语句,加入print()函数实现相同的功能。同样的还有exec语句,已经 改为exec()函数
7) 改变了顺序操作符的行为, 例如 x
1) 现在字符串只有 str 一种类型, 但它跟 2.x 版本的 unicode 几乎一样。
2) 关于字节串, 请参阅“数据类型” 的第 2 条目
1)Py3.X 去除了 long 类型, 现在只有一种整型——int, 但它的行为就像 2.X 版本 的 long
2) 新增了 bytes 类型, 对应于 2.X 版本的八位串, 定义一个 bytes 字面量的方法 如下:str 对象和 bytes 对象可以使用.encode() (str -> bytes) or .decode() (bytes ->str)方 法相互转化。
3) dict 的.keys()、 .items 和.values()方法返回迭代器, 而之前的 iterkeys()等函数都 被废弃。 同时去掉的还有dict.has_key(), 用 in 替代它吧
1) 引入抽象基类(Abstraact Base Classes, ABCs) 。
2) 容器类和迭代器类被 ABCs 化。
3) 迭代器的 next()方法改名为__next__(), 并增加内置函数 next(), 用以调用迭代 器的__next__()方法
4) 增加了@abstractmethod 和 @abstractproperty 两个 decorator, 编写抽象方法(属 性)更加方便。
1) 所以异常都从 BaseException 继承, 并删除了 StardardError
2) 去除了异常类的序列行为和.message 属性
3) 用 raise Exception(args)代替 raise Exception, args 语法
4) 捕获异常的语法改变, 引入了 as 关键字来标识异常实例
5) 异常链, 因为__context__在 3.0a1 版本中没有实现
1)移除了 cPickle 模块,可以使用 pickle 模块代替。最终我们将会有一个透明高效的 模块。
2) 移除了 imageop 模块
3) 移除了 audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter,
mimify, popen2,rexec, sets, sha, stringold, strop, sunaudiodev, timing 和 xmllib 模块
4)移除了 bsddb 模块(单独发布,可以从 http://www.jcea.es/programacion/pybsddb.htm
获取)
5) 移除了 new 模块
6) os.tmpnam()和 os.tmpfile()函数被移动到 tmpfile 模块下
7) tokenize 模块现在使用 bytes 工作。 主要的入口点不再是 generate_tokens, 而 是tokenize.tokenize()
1) xrange() 改名为 range(), 要想使用 range()获得一个 list, 必须显式调用:
>>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2) bytes 对象不能 hash, 也不支持 b.lower()、 b.strip()和 b.split()方法, 但对于
后两者可以使用 b.strip(b’ \n\t\r \f’ )和 b.split(b’ ‘)来达到相同目的
3) zip() 、 map()和 filter()都返回迭代器。而 apply()、callable()、coerce()、
execfile()、 reduce()和 reload ()函数都被去除了现在可以使用 hasattr()来 替换callable(). hasattr()的语法如: hasattr(string, '__name__')
4 ) string.letters 和相关的 .lowercase和 .uppercase被去除,请改用string.ascii_letters 等
5) 如果 x < y 的不能比较, 抛出 TypeError 异常。 2.x 版本是返回伪随机布尔值的
6) __getslice__系列成员被废弃。 a[i:j]根据上下文转换为 a.__getitem__(slice(I, j))
或 __setitem__和 __delitem__调用
7) file 类被废弃
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)处理机分给线程,即真正在处理机上运行的是线程
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体.
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。