Requests 请求和响应
一、POST方法
1、json和dict
python中的dict类型要转换为json格式的数据需要用到json库:
import
json
<string>
=
json.dumps(<
dict
>)
<
dict
>
=
json.loads(<json>)
2、requests.post()中data和json参数区别
1、如果参数为JSON数据,可以直接传入json参数,它将自动编码并将Content-Type的置为application/json
payload
=
{
'key1'
:
'value1'
,
'key2'
:
'value2'
}
r
=
requests.post(
"https://httpbin.org/post"
, json
=
payload)
print
(r.text)
2、如果data传递的参数为字符串,例如【json.dumps(payload)】,则request对参数进行url编码,Content-Type的值为None,所以data传字符串时,一定要在header中指定Content-Type
payload
=
{
'key1'
:
'value1'
,
'key2'
:
'value2'
}
headers
=
{
"Content-Type"
:
"application/json"
}
r
=
requests.post(
"https://httpbin.org/post"
, headers
=
headers,data
=
json.dumps(payload))
print
(r.text)
3、如果data传递的是字典、元组组成的列表或列表作为值的字典,则request对参数进行url编码,Content-Type的值为application/x-www-form-urlencoded
# 字典
payload1
=
{
'key1'
:
'value1'
,
'key2'
:
'value2'
}
r
=
requests.post(
"https://httpbin.org/post"
, data
=
payload1)
# 元组组成的列表
payload2
=
[(
'key1'
,
'value1'
), (
'key1'
,
'value2'
)]
r
=
requests.post(
"https://httpbin.org/post"
, data
=
payload2)
# 列表作为值的字典
payload3
=
{
'key1'
: [
'value1'
,
'value2'
]}
r
=
requests.post(
"https://httpbin.org/post"
, data
=
payload3)
二、GET方法
requests.get(url, params = None, **kwargs)
url: 拟获取页面的url链接
params: url中额外参数,字典或字节流格式,可选
三、Response 常见操作
1、response.json()【Requests中内置的JSON解码器】
相当于将接口返回的json字符串格式的响应体通过python的反序列化转为python字典格式
2、response.ok
如果status_code小于200,response.ok返回True。
如果status_code大于200,response.ok返回False。
3、response.request.headers
response.request.headers 返回此响应的请求对象中的请求头数据字典。【该字典的字典键不区分大小写,若键不存在则返回None】
4、response.request.hooks
requests提供了hook机制,让我们能够在请求得到响应之后去做一些自定义的操作;比如打印某些信息、修改响应内容等。
解释:
在上述例子中:
①定义了两个钩子函数,分别用来打印response对象中的url(print_url)和修改response对象中的url(change_url)。
②通过参数 hooks=dict(response=[print_url, change_url])调用。其中response是钩子的类型
③从运行结果中,可以看出钩子函数1(print_url)和钩子函数2(change_url)被顺序执行了,且达到了篡改响应结果的目的。
④在上述例子中,只在requests方法级别调用了一次hook,如果想要每个请求都使用hook呢?可以在requests的session对象中添加hook来让该session对象发出去的请求均带有hook,例如:
s = requests.Session() s.hooks.update({"response": [print_url, change_url]})