HTTP协议
HTTP,Hypertext Transfer Protocol,超文本传输协议。
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议。
“请求与响应”模式——用户发起请求,服务器做相关响应。
无状态——第一次请求与第二次请求之间无相关关联。
应用层——工作在传输层(TCP/IP协议)之上。
HTTP协议采用URL作为定位网络资源的标识。
URL格式:http://host[:port][path]
host:合法的Internet主机域名或IP地址
port:端口号,可省略,默认端口为80
path:请求资源在主机或IP地址中的内部路径
URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个Internet上的一个资源。
HTTP协议对资源的操作
操作 | 说明 |
---|---|
GET | 获取url的资源 |
HEAD | 获取url的头部信息(资源很大,可拿下资源的头部信息,分析资源的大概内容) |
POST | 在url资源后面增加数据,不改变原有数据 |
PUT | 向url存储资源,覆盖原有数据 |
PATCH | 局部更新url的某些资源 |
DELETE | 删除url存储的资源 |
HTTP协议与requests库的方法均相一致。
patch与 put 的区别
假设URL位置有一组数据UserInfo,其中包括UserID、UserName等20个字段。
需求:用户修改了UserName,其他不变。
·采用patch,仅向URL提交UserName的局部更新请求。
·采用put,必须将所有20个字段一并提交到URL,未提交字段将被删除。
PATCH:节省网络带宽,无需提交所有的字段。
Requests库的head方法
>>> import requests
>>> r = requests.head("http://httpbin.org/get")
>> r.headers
{'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin': '*', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json', 'Date': 'Fri, 08 Nov 2019 14:36:34 GMT', 'Referrer-Policy': 'no-referrer-when-downgrade', 'Server': 'nginx', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'Connection': 'keep-alive'}
>>> r.text
''
我们用 head 方法来访问 url 链接,再用r.headers展示url头部信息的内容。当我们想用r.text来展示url的全部信息时,发现内容为空。所以用head方法可以用很少的网络流量来获取网页的概要信息。
Requests库的post()方法
>>> payload = {'key1':'value1','key2':'value2'}
>>> r = requests.post('http://httpbin.org/post',data = payload)
>>> print(r.text)
{
...
"form": {
"key1": "value1",
"key2": "value2"
},
...
}
#我们发现向 URL POST一个字典,
#key1:value2 和 key2:value2 被放在了form(表单)字段下。
#说明向URL POST一个字典或者键值对时,会默认放在表单字段下。
>>> data = 'ABC'
>>> r = requests.post('http://httpbin.org/post',data = 'ABC')
>>> print(r.text)
{
...
"data": "ABC",
"form": {},
...
}
#我们发现字符串"ABC"被存储在了data字段中
#URL POST一个字符串时,会默认放在data字段中
这是POST方法根据用户提供的内容的不同,在服务器上会做数据的相关处理。
PUT方法与POST方法类似,但是会将原有数据覆盖掉。