HTTP协议
HTTP,Hypertext Transfer Protocol,超文本传输协议
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议
HTTP协议采用URL作为定位网络资源的标识,URL格式如下:
http://host[:port][path]
host: 合法的Internet主机域名或IP地址
port: 端口号,缺省端口为80
path: 请求资源的
HTTP URL实例:
http://www.bit.edu.cn
http://220.181.111.188/duty
HTTP URL的理解:
URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据
HTTP协议对资源的操作
GET 请求获取URL位置的资源
HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头POST 请求向URL位置的资源后附加新的数据
PUT 请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE 请求删除URL位置存储的
通过URL和命令管理资源,操作独立无状态,网络通道及服务器成为了黑盒子
PATCH和PUT的区别
假设URL位置有一组数据UserInfo,包括UserID、UserName等20个字段
需求:用户修改了UserName,其他不变
• 采用PATCH,仅向URL提交UserName的局部更新请求
• 采用PUT,必须将所有20个字段一并提交到URL,未提交字段被删除
PATCH的最主要好处:节省网络带宽
HTTP协议与Request库方法功能是一一对应的
1.head()方法
>>> import requests
>>> r = requests.head('http://httpbin.org/get')
>>> r.headers
{'Connection': 'keep-alive', 'Server': 'meinheld/0.6.1', 'Date': 'Tue, 22 Aug 2017 14:46:44 GMT', 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true', 'X-Powered-By': 'Flask', 'X-Processed-Time': '0.000668048858643', 'Content-Length': '265', 'Via': '1.1 vegur'}
>>> r.text
''
用head方法去访问一个链接,用r.headers来反馈展示的头部信息的内容,试图展示它的全部内容时内容是空
所以head方法可以用很少的流量获取网络资源的概要信息
2.post()方法
使用post()方法向服务器提供新增数据
>>> import requests
>>> payload = {'key1':'value1','key2':'value2'}
>>> r = requests.post("http://httpbin.org/post",data=payload)
>>> print(r.text)
{
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Content-Length": "23",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.18.4"
},
"json": null,
"origin": "112.0.247.58",
"url": "http://httpbin.org/post"
}
我们发现它们被放到了form字段下,说明向URL POST一个字典,自动编码为form(表单)
如果我们不提交键值对而提交字符串,我们发现它被存到了data字段下
>>> r = requests.post("http://httpbin.org/post",data='ABC')
>>> print(r.text)
{
"args": {},
"data": "ABC",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Content-Length": "3",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.18.4"
},
"json": null,
"origin": "112.0.247.58",
"url": "http://httpbin.org/post"
}
所以,post()方法根据用户提交内容的不同,在服务器上会做数据的相关整理
3.put()
put()方法与post()类似,只不过它会把原有数据覆盖掉