将鼠标移至 get处,按住Ctrl,单击鼠标左键,查看源代码
def get(url, params=None, **kwargs):
r"""Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send
in the query string for the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response ` object
:rtype: requests.Response
"""
kwargs.setdefault('allow_redirects', True)
return request('get', url, params=params, **kwargs)
从代码和注释中,可以得到这些信息:
传的参数有url,data,json,**kwargs,
其中,url是位置参数(必传参数);
params属于默认参数,默认为空,调用函数时可传可不传该默认参数的值;
params参数表示的请求格式是 query string
**kwargs 为包裹关键字参数,如果要添加该类型的参数,必须进行声明该参数的变量,加上关键字,才能解析出来
import requests
url1 = 'http://127.0.0.1:8000/axf/home/'
headers ={
"referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
res = requests.post(url,headers=headers)
print(res)
将鼠标移至 post 处,按住Ctrl,单击鼠标左键,查看源代码
def post(url, data=None, json=None, **kwargs):
r"""Sends a POST request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response ` object
:rtype: requests.Response
"""
return request('post', url, data=data, json=json, **kwargs)
从代码和注释中,可以得到这些信息:
传的参数有url,data,json,**kwargs,
其中,url是位置参数(必传参数);
data、json都是属于属于默认参数,默认为空,调用函数时可传可不传该默认参数的值
data参数表示的请求格式 Content-Type 为 application/x-www-form-urlencoded,表单形式
json参数表示的请求格式 Content-Type 为 application/json,json形式;
**kwargs 为包裹关键字参数,如果要添加该类型的参数,必须进行声明该参数的变量,加上关键字,才能解析出来
以用户注册为例
import requests
url1 = 'http://127.0.0.1:8000/axf/register/'
headers ={
"Content-Type":"application/text","referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
"mobile_phone":"17379745548","pwd":"12345678"}
res = requests.post(url,data,headers)
print(res)
这种提交方式会注册失败,因为在调用 requests.post() 方法时,无法解析 headers 变量的内容,headers需以包裹关键字参数方式传递
import requests
url1 = 'http://127.0.0.1:8000/axf/register/'
headers ={
"Content-Type":"application/text","referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
"mobile_phone":"17379745548","pwd":"12345678"}
res = requests.post(url,data,headers=headers)
print(res)
而如果参数的提交方式是json格式的形式,则可以通过该种方式提交,就不需要声明 Content-Type了,接口返回的内容,一般也是json格式,获取接口返回内容,进行输出的时候,也可以使用 json 格式的形式输出
import requests
url1 = 'http://127.0.0.1:8000/axf/register/'
headers ={
"referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
"mobile_phone":"17379745548","pwd":"12345678"}
res = requests.post(url,json=data,headers=headers)
print(res.json())
当然,也可以通过这种方式提交json格式的数据
import requests
url1 = 'http://127.0.0.1:8000/axf/register/'
headers ={
"Content-Type":"application/json","referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
"mobile_phone":"17379745548","pwd":"12345678"}
res = requests.post(url,data,headers=headers)
print(res)
在某些网站,用户登录后,用户信息会带有 token 信息,作为鉴权内容,例如用户在登录后进行某些相应操作,这些接口的访问都需要带上 token 信息,所以,在用户登录成功后,需要在登录接口返回信息中提取 token 信息的值
import requests
url1 = 'http://127.0.0.1:8000/axf/login/'
headers ={
"referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
"mobile_phone":"17379745548","pwd":"12345678"}
res = requests.post(url,json=data,headers=headers)
print(res.json())
返回的接口信息如下:
{
"code":"0000",
"statu":"ok",
"data":
{
"id": 700963644,
"username": "苹果",
"token":"EJF5232E929BA0197B33840B0CBC2F4706F85"
}
}
token 本质上就是字符串,所以,在返回的json数据中提取出 token 就行了,在访问某个接口需要用到 token 时,就在接口中加上token 信息
token = res.json()["data"]["token"]
token 信息可能放在请求头 headers 里,也可能放到请求体 body 里,这个依据开发的接口文档而定
有些页面,比如购物车页面,用接口方式进行访问,需要带上用户信息,才能返回购物车页面的商品信息
import requests
url1 = 'http://127.0.0.1:8000/axf/login/'
headers ={
"referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
"mobile_phone":"17379745548","pwd":"12345678"}
res = requests.post(url,json=data,headers=headers)
token = res.json()["data"]["token"]
url2 = 'http://127.0.0.1:8000/axf/cart/'
headers2 ={
"referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50","token"=token}
res2 = requests.post(url2,json=data,headers=headers2)
print(res2.text)
有些项目是使用 token 进行鉴权,有些则是采用 cookie 信息
采用 cookie 信息进行鉴权的,登录成功后接口中就没有返回相应的 token 信息,可能返回的就是这个样子
{
"code":"0000",
"statu":"ok",
"data":
{
"id": 700963644,
"username": "苹果"
}
}
而有些页面,比如购物车页面,如果这时候进行用接口方式进行访问,且没有带上用户信息,会提示你去登录,或者返回报错
import requests
url1 = 'http://127.0.0.1:8000/axf/login/'
url2 = 'http://127.0.0.1:8000/axf/cart/'
headers ={
"referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
"mobile_phone":"17379745548","pwd":"12345678"}
res1 = requests.post(url1,json=data,headers=headers)
print(res1.json())
res2 = requests.post(url2,json=data,headers=headers)
print(res2.text)
res2返回的的内容,并不是购物车页面的内容。可是,鉴权的方式又不是token了,接口返回的参数内容中又没有相关信息,这要怎么进行接口测试?
在用户登录成功后,服务器会有一个 setcookie 的操作,服务器返回的内容,会在 headers 里存放cookie信息,服务器和浏览器之间,就通过 session会话 进行交流。
浏览器cookie中的信息,可能是长这个样子,这个是服务端定义的一个字段,名称中可能会带有 “session”,但一般都不会设置这么明显
JESESSIONID = CBC2F4EJF5232E929BA0197B33840B0706F85
服务端进行用户鉴权,就是通过这个字段,浏览器与服务端进行会话时,会自动带上 cookie 信息,而我们的代码中,则没有 cookie 信息,所以不会正确返回购物车页面的相关信息
所以,在代码中,登录操作成功后,需要获取 cookie 信息
import requests
url1 = 'http://127.0.0.1:8000/axf/login/'
url2 = 'http://127.0.0.1:8000/axf/cart/'
headers ={
"referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
"mobile_phone":"17379745548","pwd":"12345678"}
res1 = requests.post(url1,json=data,headers=headers)
print(res1.json())
# 获取cookie
cookies = res1.cookies
res2 = requests.post(url2,json=data,headers=headers,cookies=cookies)
print(res2.text)
当然,如果登录成功后接口返回的不是 json 格式的数据,而是 html 格式的数据,那就可能需要使用正则去匹配到 cookie 信息,再进行一些处理操作
上面说述方法,每次都要带上 cookie ,有没有简单一点的操作?
还可以通过 session 方式进行会话。requests库中,封装了 session 方法
import requests
session = requests.Session()
url1 = 'http://127.0.0.1:8000/axf/login/'
url2 = 'http://127.0.0.1:8000/axf/cart/'
headers ={
"referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
"mobile_phone":"17379745548","pwd":"12345678"}
res1 = session.post(url1,json=data,headers=headers)
print(res1.json())
res2 = session.post(url2,json=data,headers=headers)
print(res2.text)
session.close()
这种方式,也能成功访问购物车页面,可以理解为,session 实现了浏览器的功能,代码通过 session 与服务端进行会话
但是,这里要注意,如果存在多个 session 会话,会话之间的信息不流通使用
import requests
session = requests.Session()
url1 = 'http://127.0.0.1:8000/axf/login/'
url2 = 'http://127.0.0.1:8000/axf/cart/'
headers ={
"referer-Media":"BAIDUID=2E929BA0197B330B0CBC2F4706F85F50"}
data = {
"mobile_phone":"17379745548","pwd":"12345678"}
res1 = session.post(url1,json=data,headers=headers)
print(res1.json())
res2 = session.post(url2,json=data,headers=headers)
print(res2.text)
session2 = requests.Session()
res3 = session2.post(url2,json=data,headers=headers)
print(res3.text)
res3打印出来的内容,不是购物车页面的内容,因为 session2 这个会话没有进行登录操作