接口说明
#使用requests库前都要导入requests库
import requests
#发送GET,POST,PUT,DELETE,HEAD 以及 OPTIONS 请求
r = requests.get('https://postman-echo.com/get')
r = requests.post('https://postman-echo.com/post')
r = requests.put('https://postman-echo.com/put')
r = requests.delete('https://postman-echo.com/delete')
r = requests.head('https://postman-echo.com/get')
响应对象Response
响应状态码、响应头、响应体
import requests
# 访问百度首页
# 返回值为Response对象
resp = requests.get('https://www.baidu.com')
# 查看响应状态码
print(resp.status_code)
# 200
# 查看响应头
print(resp.headers)
# 查看响应体,未进行解码
# content 是字节类型数据
print(resp.content)
# 查看响应体,解码之后的
print(resp.text)
字符编码
请求发出后,Requests 会基于 HTTP 头部对响应的编码作出推测。
当你访问 resp.text 之时,Requests 会使用其推测的文本编码, 如果 request 推测的编码和实际的响应的编码不同则可能出现乱码。
我们可以通过 resp.encoding 查看当前猜测的编码, 也可以通过赋值来改变这个编码.
import requests
resp = requests.get('https://www.baidu.com')
# 查看当前的 encoding
print(resp.encoding)
# 'ISO-8859-1'
# 更改 encoding
resp.encoding = 'utf-8'
# 查看更改后的 encoding
print(resp.encoding)
# 'utf-8'
# 查看解码的文本内容
print(resp.text)
# 非乱码的内容
Response.json()
Response.json()方法可以将接口json格式的返回内容自动转换为python的字典
import requests
# 这里请求 postman 提供的地址,他会返回一个 json 格式的响应体
url = 'https://postman-echo.com/ip'
resp = requests.get(url)
# 字符串格式返回响应体内容
print(resp.text, type(resp.text))
# 通过响应对象的 json 方法获取 json 数据
print(resp.json(), type(resp.json()))
返回内容如下
{"ip":"183.47.51.10"} <class 'str'>
{'ip': '183.47.51.10'} <class 'dict'>
注意:如果 JSON 解码失败, r.json() 就会抛出一个异常。例如,响应内容是 html 格式的,尝试访问 r.json() 将会抛出异常。
import requests
# 这里请求百度首页
url = 'https://www.baidu.com'
# 请求 baidu 的首页,这里会获得 html
resp = requests.get(url)
# 响应体不是 json 类型,会抛出异常
print(resp.json())
错误信息如下:
Traceback (most recent call last):
File "/home/python/code/requests_code/requests_4_jsonerr.py", line 10, in
print(resp.json())
File "/home/python/.virtualenvs/test_v7/lib/python3.6/site-packages/requests/models.py", line 896, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/lib/python3.6/json/__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.6/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
发送GET请求
传递URL参数
import requests
# 这个接口会把我们传递的 url 参数,通过响应体返回
url = 'https://postman-echo.com/get'
resp = requests.get(url)
# 查看响应体 json
print(resp.json())
print('='*80)
# GET请求时传递参数
payload = {'key1': 'value1', 'key2': 'value2', 'key3': ['value3', 'valua4']}
# 通过 params 参数传递 url 参数
resp = requests.get(url, params=payload)
# 查看发起请求的的完整 url
print(resp.url)
# 查看响应体
print(resp.json())
print('='*80)
# 手动拼接参数
url = 'https://postman-echo.com/get?key1=value1&key2=value2&key3=value3&key3=value4'
resp = requests.get(url)
# 查看响应体 json
print(resp.json())
定制请求头
import requests
# 这个接口会把我们携带的请求头通过响应体返回
url = 'https://postman-echo.com/headers'
resp = requests.get(url)
# 查看响应体 json
print(resp.json())
print('='*80)
# 定义请求头字典
headers = {'name': 'mike'}
# 通过 headers 参数传递自定义请求头
resp = requests.get(url, headers=headers)
# 查看响应体 json
print(resp.json())
定制cookies
import requests
# 这个接口会把我们携带的cookies通过响应体返回
url = 'https://postman-echo.com/cookies'
resp = requests.get(url)
# 查看响应体 json
print(resp.json())
print('='*80)
# 构建 cookie
cookies = {
'foo1':'foo1',
'foo2':'foo2'
}
# 通过 cookies 参数发送 cookies
resp = requests.get(url, cookies=cookies)
# 查看响应体 json
print(resp.json())
发送POST请求
在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json
data主要是发送表单格式报文
json主要是发送json格式报文
以下发送json格式数据:
import requests
import requests
# 目标url
url = 'http://127.0.0.1:8000/login/'
# 构造请求体
info = {
"username":"1234",
"password":"123456",
"remembered":True
}
# 向目标url发送post请求
response = requests.post(url, json=info)
# 打印响应内容
print(response.json())
============================================
利用requests.session进行状态保持
- 我们通过浏览器进行登录操作时,服务器会返回cookie,浏览器会把这些 cookie 存储下来,下次发起请求就把之前保存的 cookie 携带着发送给服务器,从而实现了状态保持。
- 我们通过 requests进行登录操作或者其他操作,服务器返回了 cookie,下次再通过 requests发起其他请求时,requests 并不会把前面请求的 cookie 携带着发送给服务器,也就是说我们通过 requests是无法自动实现状态保持的。
- requests模块中的Session类能够自动处理发送请求获取响应过程中产生的cookie,进而达到状态保持的目的。
- session实例在请求了一个网站后,对方服务器设置在本地的cookie会保存在session对象中,下一次再使用session请求对方服务器的时候,会带上前一次的cookie
需求:获取用户信息。获取用户信息必须先调用进行用户登录接口,在调用获取用户信息接口。
requests方式:
import requests
# 目标url
url = 'http://127.0.0.1:8000/login/'
# 构造请求体
info = {
"username":"1234",
"password":"123456",
"remembered":True
}
# 向目标url发送post请求
resp = requests.post(url, json=info)
# 打印响应内容
print(resp.json())
# 获取用户信息
resp = requests.get('http://127.0.0.1:8000/info/')
print(resp.json())
运行结果如下:
{'code': 0, 'errmsg': 'ok'}
{'code': 400, 'errmsg': '未登陆!'}
session方式:
import requests
# 目标url
url = 'http://127.0.0.1:8000/login/'
# 构造请求体
info = {
"username":"1234",
"password":"123456",
"remembered":True
}
# 创建session对象
session = requests.Session()
# 向目标url发送post请求
resp = session.post(url, json=info)
# 打印响应内容
print(resp.json())
# 获取用户信息
resp = session.get('http://127.0.0.1:8000/info/')
print(resp.json())
运行结果如下:
{'code': 0, 'errmsg': 'ok'}
{'code': 0, 'errmsg': 'ok', 'info_data': {'username': '1234', 'mobile': '13344445555', 'email': '', 'email_active': False}}