基本概念

接口上下游传参 一般就是值 多个接口串联

接口上下游传参 - 图1
上面三个接口 就有很强的关联性

  1. 注册用户
  2. 用户登录
  3. 搜索商品

登录成功之后,会返回 token 值
token 每次登录成功 — 每次都不一样。
在搜索商品的时候 需要使用到 token值。

处理注册接口与登录接口

将注册使用的手机号和 登录使用的手机号 统一放在最外层。

  1. import random
  2. import requests
  3. import hashlib
  4. def get_phone():
  5. """
  6. 生成随机的11位手机号码
  7. 手机号的前缀; ['13','17','18','15']
  8. 后面需要随机生成 9位数。
  9. :return:
  10. """
  11. # 手机号码前缀 从列表中随机选择其中的一个值
  12. pre_phone = random.choice(['13','17','18','15'])
  13. # 随机的一个值
  14. nums = ""
  15. for i in range(9):
  16. # 每次随机的时候 生成 0-9 之间的一个数字
  17. num = random.randint(0,9)
  18. # 每次生成一个新的随机值 做一次拼接
  19. nums = nums + str(num)
  20. # 前缀和后面的值拼接在一起 组成手机号
  21. return pre_phone+nums
  22. # 将公共使用的手机号码放在最外层
  23. phone = get_phone()
  24. def test_register():
  25. """
  26. 注册用户
  27. :return:
  28. """
  29. url = "http://49.233.108.117:28019/api/v1/user/register"
  30. body_data = {
  31. "loginName": phone, # 通过调用函数 生成手机号码
  32. "password": "123456"
  33. }
  34. print(f'现在进行注册:用户名{phone},密码为123456')
  35. # 发送 json 格式 post请求
  36. r = requests.post(url, json=body_data)
  37. # 状态码
  38. print(r.status_code)
  39. print(r.json())
  40. def test_login():
  41. """
  42. 用户登录
  43. :return:
  44. """
  45. passwd = hashlib.md5('123456'.encode()).hexdigest()
  46. url = "http://49.233.108.117:28019/api/v1/user/login"
  47. body_data = {
  48. "loginName": phone,
  49. "passwordMd5": passwd # 使用md5 加密之后的密文进行登录
  50. }
  51. print(f'现在进行登录: 用户名为 {phone},加密之后的密码 {passwd}')
  52. r = requests.post(url, json=body_data)
  53. print(r.status_code)
  54. print(r.json())
  55. def test_search():
  56. """
  57. 搜索商品
  58. :return:
  59. """
  60. if __name__ == '__main__':
  61. test_register()
  62. test_login()

上下游参数关联

上面的注册和登录例子 使用的都是 同一个手机号码。 只需要将手机号码设置到函数外面即可。
如果 上一个接口的出参 作为 下一个接口的入参,这种类型的接口处理起来就需要别的操作的。

代码示例

  1. n = 0
  2. def f1():
  3. n = 1
  4. print(n)
  5. def f2():
  6. print(n)
  7. if __name__ == '__main__':
  8. f1() # 1
  9. f2() # 0

如果我想将f1 中的值 传递给 f2
可以借助 字典数据类型进行参数的传递

  1. import random
  2. testdata = {
  3. "f1":0
  4. }
  5. def f1():
  6. n = random.randint(100,999)
  7. print(n)
  8. # 将n的随机值 赋给 字典中的 f1
  9. testdata['f1'] = n
  10. def f2():
  11. """
  12. 我希望在这个函数中引用 f1 函数中生成 随机值
  13. :return:
  14. """
  15. # 取到的值 与 f1 中的值是一样的
  16. print(testdata['f1'])
  17. if __name__ == '__main__':
  18. f1()
  19. f2()

搜索商品

根据接口文档,搜索商品 在 信息头中添加token 值,token是从登录接口中,每次登录,返回的token值都不一样。

搜索商品接口
请求方式 :GET
请求路径:http://49.233.108.117:28019/api/v1/search
请求参数:

  1. {
  2. "keyword":"商品名"
  3. }

请求headers

  1. {
  2. "token":"登录接口返回的token值"
  3. }

Python代码

在函数外部定义字典数据类型,在字典中定义 token字段
登录成功之后 更新字典中的token的值。
后面的接口中使用 需要使用到token 直接引用 字典中token。

  1. import random
  2. import requests
  3. import hashlib
  4. # 设置初始的测试数据,token值默认为None
  5. testdata = {
  6. "token":None
  7. }
  8. def get_phone():
  9. """
  10. 生成随机的11位手机号码
  11. 手机号的前缀; ['13','17','18','15']
  12. 后面需要随机生成 9位数。
  13. :return:
  14. """
  15. # 手机号码前缀 从列表中随机选择其中的一个值
  16. pre_phone = random.choice(['13','17','18','15'])
  17. # 随机的一个值
  18. nums = ""
  19. for i in range(9):
  20. # 每次随机的时候 生成 0-9 之间的一个数字
  21. num = random.randint(0,9)
  22. # 每次生成一个新的随机值 做一次拼接
  23. nums = nums + str(num)
  24. # 前缀和后面的值拼接在一起 组成手机号
  25. return pre_phone+nums
  26. # 将公共使用的手机号码放在最外层
  27. phone = get_phone()
  28. def test_register():
  29. """
  30. 注册用户
  31. :return:
  32. """
  33. url = "http://49.233.108.117:28019/api/v1/user/register"
  34. body_data = {
  35. "loginName": phone, # 通过调用函数 生成手机号码
  36. "password": "123456"
  37. }
  38. print(f'现在进行注册:用户名{phone},密码为123456')
  39. # 发送 json 格式 post请求
  40. r = requests.post(url, json=body_data)
  41. # 状态码
  42. print(r.status_code)
  43. print(r.json())
  44. def test_login():
  45. """
  46. 用户登录
  47. :return:
  48. """
  49. passwd = hashlib.md5('123456'.encode()).hexdigest()
  50. url = "http://49.233.108.117:28019/api/v1/user/login"
  51. body_data = {
  52. "loginName": phone,
  53. "passwordMd5": passwd # 使用md5 加密之后的密文进行登录
  54. }
  55. print(f'现在进行登录: 用户名为 {phone},加密之后的密码 {passwd}')
  56. r = requests.post(url, json=body_data)
  57. print(r.status_code)
  58. print(r.json())
  59. print("登录成功的token值:",r.json()["data"])
  60. # 将获取到的token值更新在 字典中
  61. testdata['token'] = r.json()['data']
  62. def test_search():
  63. """
  64. 搜索商品
  65. :return:
  66. """
  67. url = "http://49.233.108.117:28019/api/v1/search"
  68. qury_data = {
  69. "keyword":"iphone"
  70. }
  71. header = {
  72. "token": testdata['token'] # 引用登录成功之后更新的token值
  73. }
  74. print(f'现在搜索商品,使用信息头: {header}')
  75. r = requests.get(url,params=qury_data,headers=header)
  76. print('搜索结果',r.json())
  77. if __name__ == '__main__':
  78. test_register()
  79. test_login()
  80. test_search()

也是使用 字典数据类型的方式,将值放在字典,
登录成功之后 更新字典的值
搜索接口中 引用已经更新好的值。

也可以使用类变量的方式进行参数传递

python 类代码

  1. import random
  2. import requests
  3. import hashlib
  4. def get_phone():
  5. """
  6. 生成随机的11位手机号码
  7. 手机号的前缀; ['13','17','18','15']
  8. 后面需要随机生成 9位数。
  9. :return:
  10. """
  11. # 手机号码前缀 从列表中随机选择其中的一个值
  12. pre_phone = random.choice(['13','17','18','15'])
  13. # 随机的一个值
  14. nums = ""
  15. for i in range(9):
  16. # 每次随机的时候 生成 0-9 之间的一个数字
  17. num = random.randint(0,9)
  18. # 每次生成一个新的随机值 做一次拼接
  19. nums = nums + str(num)
  20. # 前缀和后面的值拼接在一起 组成手机号
  21. return pre_phone+nums
  22. class TestConfigData:
  23. # 类变量的方式获取 手机号
  24. PHONE = get_phone()
  25. # 设置初始的token
  26. TOKEN = None
  27. class TestShopApi:
  28. def test_register(self):
  29. """
  30. 注册用户
  31. :return:
  32. """
  33. url = "http://49.233.108.117:28019/api/v1/user/register"
  34. body_data = {
  35. "loginName": TestConfigData.PHONE, # 通过调用函数 生成手机号码
  36. "password": "123456"
  37. }
  38. print(f'现在进行注册:用户名{TestConfigData.PHONE},密码为123456')
  39. # 发送 json 格式 post请求
  40. r = requests.post(url, json=body_data)
  41. # 状态码
  42. print(r.status_code)
  43. print(r.json())
  44. def test_login(self):
  45. """
  46. 用户登录
  47. :return:
  48. """
  49. passwd = hashlib.md5('123456'.encode()).hexdigest()
  50. url = "http://49.233.108.117:28019/api/v1/user/login"
  51. body_data = {
  52. "loginName": TestConfigData.PHONE,
  53. "passwordMd5": passwd # 使用md5 加密之后的密文进行登录
  54. }
  55. print(f'现在进行登录: 用户名为 { TestConfigData.PHONE},加密之后的密码 {passwd}')
  56. r = requests.post(url, json=body_data)
  57. print(r.status_code)
  58. print(r.json())
  59. print("登录成功的token值:", r.json()["data"])
  60. # 将登录成功的token 值更新到类变量中
  61. TestConfigData.TOKEN = r.json()['data']
  62. def test_search(self):
  63. """
  64. 搜索商品
  65. :return:
  66. """
  67. url = "http://49.233.108.117:28019/api/v1/search"
  68. qury_data = {
  69. "keyword": "iphone"
  70. }
  71. header = {
  72. # 使用类变量 获取最新的token值
  73. "token": TestConfigData.TOKEN
  74. }
  75. print(f'现在搜索商品,使用信息头: {header}')
  76. r = requests.get(url, params=qury_data, headers=header)
  77. print('搜索结果', r.json())
  78. if __name__ == '__main__':
  79. t1 = TestShopApi()
  80. t1.test_register()
  81. t1.test_login()
  82. t1.test_search()

思维导图

接口上下游传参 - 图2