基础概念之HTTP
HTTP协议的作用及特点HTTP是一个客户端和服务器端请求与应答的标准,客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或其他工具,向客户端发起一个到服务器上指定端口(默认端口号80)的HTTP请求。我们称这个客户端叫user agent,应答的服务器端(网站)存储着一些HTML文件或图像等信息,这个服务器我们称之为origin server。在用户代{过}{滤}理和源服务器中间可能存在多个中间层,如代{过}{滤}理、网关或者tunnels(隧道)。HTTP可以用在任何其他互联网协议上,HTTP只假定可靠的传输。
由HTTP客户端发起一个请求,建立一个到服务器指定端口的TCP连接,HTTP服务器则在那个端口监听客户端发过来的请求,收到请求后,服务器发回客户端一个状态行,比如“HTTP/1.1 200 OK ”,和响应的信息。HTTP用TCP的原因在于,TCP可以提供传输控制,错误纠正、按顺序组织数据的功能。
通过HTTP或HTTPS协议请求的资源由URLs来标识
[*]基于请求/响应模型的协议。请求和响应必须配对,先有请求再有响应
[*]简单快速:客户端向服务器请求服务时,只需要请求方法和路径。请求方法常用的有GET 、HEAD、POST
[*]灵活:HTTP允许传输任意类型的数据对象,正在传输的类型用Connent-Type标记。
[*]无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完请求,并收到应答后,即断开连接,这种方式可以节省传输时间。
[*]无状态:HTTP协议是无状态协议,无状态是指对于事物处理没有记忆能力,缺少状态意味着无法处理前面传输的信息,有问题需要重传,这样可能导致每次连接传送的数据量增大;另一方面,在服务器不需要前面的信息的时候他应答就很快
HTTP协议的版本
HTTP/1.0 发送请求 创建一次连接,获得一个web资源,连接断开
HTTP/1.1 发送请求 创建一次连接,获得多个web资源,连接断开HTTP协议的组成
HTTP协议由HTTP请求和HTTP响应组成。HTTP请求包括:请求行、请求头、请求体,响应相似。
[*]HTTP请求报文
请求行:例如 POST/chapter17/user.html HTTP/1.1
格式 : 请求方式 资源路径 协议/版本
请求行必须在HTTP请求格式的第一行
[*]get请求:将请求参数追加在url后面,不安全,url长度限制get请求方式数据大小,没有请求体,一般的HTTP请求大多都是GET
[*]POST请求:请求参数在请求体处,较安全,请求数据大小没有显示,只有表单设置为method=“post”才是post请求,其他都是get请求,常见get请求如地址栏直接访问、<a href="">、<img src="">等
[*]HEAD请求:HEAD和GET相似,不过服务端接受到HEAD请求时只返回响应头,不发送响应内容,所以当只看页面状态时,用HEAD更有效,因为省去传输页面内容的时间。
[*]DELETE请求:删除某一个资源
[*]OPTIONS请求:用于获取当前URL所支持的方法。若请求成功,会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET、POST”
[*]PUT请求:把一个资源存放在指定的位置上,本质上讲,PUT和POST极为相似,都是向服务器发送数据,但他们之间有一个重要的区别,PUT通常指定了资源的存放位置,而POST没有,POST的数据存放位置由自己决定。
[*]TRACE请求:回显服务器的请求,用于测试或诊断。
[*]CONNECT请求:CONNECT方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代{过}{滤}理服务器,通常用于SSL加密翻译为一起的连接与非加密的HTTP代{过}{滤}理服务器的通信。
REST:
全称是表述性状态转移。表述指的是资源,任何需要被引用的,只要有被引用的必要,它就是资源。要让资源有一个唯一的标识,在Web中这个唯一的标识就是URI,URI既可以当成是资源的地址,也可以看成是资源的名称,如果这些信息没有能用URL标识表示,那它就不能算是一个资源,只能算是资源的一些信息。URI的设计应该遵循可寻址性原则,具有自描述性,需要在形式上给人以直觉上的关联。
URI设计的技巧:
[*]使用-或者_来让URI可读性更好
[*]使用 / 来表示资源的层级关系
[*]使用?用来过滤资源
[*]使用, 或者 ; 可以用来表示同级资源的关系
统一资源接口:
RESTful架构应该遵循统一接口原则,统一接口包括了一组受限的预定义操作,不论用什么样的资源,都是通过使用相同的接口进行资源的访问。接口应该使用标准的HTTP方法如GET、PUT、POST,并遵循这些方法的语义。GET、DEKETE、PUT、POST的典型用法:
GET:
[*]安全且幂等
[*]获取表示
[*]变更时获取表示(缓存)
[*]200 OK -表示已在响应中发出 204(无内容) -资源有空表示 301 (Move Permanently) -资源的URI已被更新 303 (See Other-其他,如负载均衡 304(not modified)-资源未更改(缓存)
[*]400(bad request)-指代坏请求,如参数错误 404(not found)-资源不存在 406(not acceptable)-服务端不支持所需表示
[*]500(internal server error)-通用错误响应 503(Service Unavaliable)-服务器端无法处理请求
PUT:
[*]不安全但幂等
[*]用客户端管理的实例号创建一个资源
[*]通过替换的方式更新资源
[*]如果未被修改,则更新资源(乐观锁)
POST:
[*]不安全且不幂等
[*]使用服务端管理的实例号创建资源
[*]创建子资源
[*]部分更新资源
[*]如果未被修改,则更新资源(乐观锁)
DELETE:
[*]不安全但幂等
[*]删除资源
HTTP请求报文头属性
常见请求头:
[*]Referer:表示这个请求是从哪个URL跳转过来的(直接访问就不会有这个请求头)
[*]Accept:告诉服务端,请求所能支持的响应类型,如html、css、js(MIME类型)
[*]if-Modified-Sincce:预览器通知服务器,本地缓存的最后变更时间。
[*]Cookie:客户端的Cookie通过这个报文属性传给服务端。
[*]User-Agent:预览器通知服务器,客户端预览器与操作系统相关信息。
[*]Connection:表示客户端与服务连接类型;Keep-Alive表示持久连接,close表示已关闭
[*]Host:请求的服务器主机名。
[*]Content-Length:请求体的长度。
[*]Content-Type:请求的与实体对应的MIME信息。如果是Post请求,会有这个头。
状态码:
1** :指示信息,表示请求已接收,继续处理。
2**:成功,表示请求已被成功接受,处理。
[*]200 OK
[*]204 No Content:无内容。服务器成功处理但是未返回内容
3**:重定向
[*]301 Moved Permanently:永久重定向,表示请求的资源已经永久搬到了其他位置。
[*]302 Found:临时重定向,表示请求的资源临时搬到了其他位置。
[*]303 See Other:临时重定向,应使用GET定向获取请求资源。
4**:客户端错误
[*]400 Bad Request:客户端有语法错误,服务器无法理解。
[*]401 Unauthorized:请求未经授权
[*]403 Forbidden:服务器收到请求,但是拒绝提供服务。
[*]404 Not Found:请求资源不存在
5**:服务器端错误,服务器未能实现合法的请求。
[*]500 Internal Server Error:服务器发生不可预期的错误。
[*]503 Server Unavailable:服务器当前不能处理客户端请求,一段时间后可能恢复。
Cookie:
由于HTTP是无状态的,而服务器端的业务必须是有状态的,Cookie最初的目的是未来存储web中的状态信息,以方便服务器端的使用。
[*]cookie的处理步骤 (1)服务器向客户端发送Cookie(2)预览器将cookie保存(3)之后每次的HTTP请求,预览器都会将cookie发送给服务端
[*]服务器端的发送与解析
感谢,学习了,先收藏下,以后备用 学习python爬虫有用,谢谢了 补充一下:405 请求方式错误 学习学习,多谢分享 不错的文章,可以补一下相关知识。 make一下 多谢 每次看这个都很头痛,认真看完一遍,感觉懂了,过段时间又发现自己没有懂@-@ 之前对http的知识一直欠佳,确实该补补了,感谢楼主 学习中,非常感谢
页:
[1]
2