接口串联

在做一些有业务关联的接口时 需要接口之间进行数据传递。
上下游传参 - 图1
这两个接口在做测试的时候,需要接口串联, 每次生成的topic_id值都不一样,需要动态从上游接口中提取出来传递给下游接口。


在接口串联之间,先说明一下 函数中参数的作用域。

函数内部定义的变量

  1. # 定义变量a
  2. a = 10
  3. def f1():
  4. a = 20 # 函数内部定义变量 a
  5. print(f"f1-a {a}")
  6. if __name__ == '__main__':
  7. f1()

代码执行结果为20
image.png
因为f1 函数内部 a=20 执行函数的时候,如果函数内部定义的有变量,函数在运行的过程中,会优先使用函数内部定义的变量。 所以执行结果为20。

  1. # 定义变量a
  2. a = 10
  3. def f1():
  4. a = 20 # 函数内部定义变量 a 这个 a的值 只在 函数内有效。
  5. print(f"f1-a {a}")
  6. print(f"文件中的a的值 {a}") # 10
  7. if __name__ == '__main__':
  8. f1()

  1. # 定义变量a
  2. a = 10
  3. def f1():
  4. a = 20 # 函数内部定义变量 a 这个 a的值 只在 函数内有效。
  5. print(f"f1-a {a}")
  6. def f2():
  7. print(f"a的值为 {a}")
  8. # print(f"文件中的a的值 {a}") # 10
  9. if __name__ == '__main__':
  10. f1()
  11. f2() # 10 取文件中定义的a的值

字典值跨函数使用

  1. # 随机函数
  2. import random
  3. # 定义字典 可以通过修改 key 对应的value
  4. data = {
  5. "rn": None
  6. }
  7. def f1():
  8. # 随机生成一个数字
  9. num = random.randint(1,100000)
  10. # 修改字典中 rn字段的值
  11. data["rn"] = num
  12. print(f'f1 生成随机数字 {num}')
  13. def f2():
  14. """
  15. 需要将 f1函数中生成 随机数字 传递过来,进行使用。
  16. :return:
  17. """
  18. print(f'f2 使用f1生成的随机数字:{data["rn"]}')
  19. if __name__ == '__main__':
  20. f1()
  21. f2()

image.png


字典类型中数据 是可变类型。主要就是通过使用这种可变方式的特性,在上游接口中更改字典中对应字段的值,在下游接口中引用字典字段的值。 通过字典数据的方式来进行参数串联。


接口中的参数串联

利用字典的特性,实现CNnode 主要接口的参数串联。

  1. """
  2. cnode 社区接口作业
  3. """
  4. import requests
  5. # 定义请求地址前缀
  6. baseurl = "http://47.100.175.62:3000/api/v1"
  7. token = "e80fce05-b85c-445e-a26e-66172deffb24"
  8. # 预先定义字典格式的数据
  9. test_data={
  10. "topic_id":"", # 需要进行上下游传参的字段 初始值为 空字符串
  11. "reply_id":"" # 评论id 需要进行上下游传参, 初始值设置为 空字符
  12. }
  13. def test_add_topic():
  14. """
  15. 创建话题
  16. :return:
  17. """
  18. url = baseurl+"/topics"
  19. body_data = {
  20. "accesstoken": token,
  21. "title":"hehehehehehe",
  22. "tab":"ask",
  23. "content":"xxxxxxxxxxxx"
  24. }
  25. r = requests.post(url,json=body_data)
  26. print("新建主题:",r.status_code,r.json())
  27. # 从返回结果中提起 话题的id
  28. tid = r.json()["topic_id"]
  29. # 将提取出来的值tid 更新到 外边定义的字典中 test_data[”topic_id”]
  30. test_data["topic_id"] = tid # 上游更新值
  31. def test_edit_topic():
  32. """
  33. 编辑话题
  34. :return:
  35. """
  36. url = baseurl + "/topics/update"
  37. body_data = {
  38. "accesstoken": token,
  39. # "topic_id":"625cc91ceb0fc111c4a0d584",
  40. "topic_id": test_data["topic_id"] , # 通过字典 topic_id 字段引用最新的值。
  41. "title": "hehehehehehe",
  42. "tab": "ask",
  43. "content": "xxxxxxxxxxxx"
  44. }
  45. r = requests.post(url, json=body_data)
  46. print("编辑主题:", r.status_code, r.json())
  47. def test_collect_topic():
  48. """
  49. 收藏话题
  50. :return:
  51. """
  52. url = baseurl + "/topic_collect/collect"
  53. body_data = {
  54. "accesstoken": token,
  55. # "topic_id":"625cc91ceb0fc111c4a0d584"
  56. "topic_id": test_data["topic_id"]
  57. }
  58. r = requests.post(url, json=body_data)
  59. print("收藏主题:", r.status_code, r.json())
  60. def test_uncollect_topic():
  61. """
  62. 取消收藏
  63. :return:
  64. """
  65. url = baseurl + "/topic_collect/de_collect"
  66. body_data = {
  67. "accesstoken": token,
  68. # "topic_id": "625cc91ceb0fc111c4a0d584"
  69. "topic_id": test_data["topic_id"]
  70. }
  71. r = requests.post(url, json=body_data)
  72. print("取消主题:", r.status_code, r.json())
  73. def test_reply_topic():
  74. """
  75. 评论话题
  76. :return:
  77. """
  78. url = baseurl + "/topic/625cc91ceb0fc111c4a0d584/replies"
  79. body_data = {
  80. "accesstoken": token,
  81. "content": "helloworld"
  82. }
  83. r = requests.post(url, json=body_data)
  84. print("新建评论:", r.status_code, r.json())
  85. # 从结果中提取 评论id
  86. rid = r.json()["reply_id"]
  87. # 将提取到的值更新到字典中
  88. test_data["reply_id"] = rid
  89. def test_up():
  90. """
  91. 点赞
  92. :return:
  93. """
  94. # url = baseurl + "/reply/625cca2ceb0fc111c4a0d5e4/ups"
  95. # 引用变量
  96. url = baseurl + f'/reply/{test_data["reply_id"]}/ups'
  97. body_data = {
  98. "accesstoken": token
  99. }
  100. r = requests.post(url, json=body_data)
  101. print("为评论点赞:", r.status_code, r.json())
  102. if __name__ == '__main__':
  103. print("现在开始进行cnode社区主要接口流程测试:")
  104. test_add_topic()
  105. test_edit_topic()
  106. test_collect_topic()
  107. test_uncollect_topic()
  108. test_reply_topic()
  109. test_up()

新丰商城中接口串联

  1. # 导入生成的手机号
  2. from common.utils import generate_phone
  3. import requests
  4. # 1. 设置手机号 后面函数中使用手机号 都从这里获取
  5. phone = generate_phone()
  6. # 定义字典
  7. test_data = {
  8. "token":None, # 存放token
  9. "goodsid":None
  10. }
  11. # 用户注册
  12. def test_register():
  13. url = "http://49.233.108.117:28019/api/v1/user/register"
  14. body_data = {
  15. "loginName": phone,
  16. "password": "123456"
  17. }
  18. print(f"使用数据进行注册:{body_data}")
  19. r = requests.post(url,json=body_data)
  20. # 打印请求的信息头
  21. print("注册的请求头", r.request.headers)
  22. # 打印返回结果
  23. print("注册结果", r.json())
  24. # 用户登录
  25. def test_login():
  26. url = "http://49.233.108.117:28019/api/v1/user/login"
  27. body_data = {
  28. "loginName": phone,
  29. "passwordMd5": "E10ADC3949BA59ABBE56E057F20F883E"
  30. }
  31. print(f'使用数据进行登录 {body_data}')
  32. r = requests.post(url,json=body_data)
  33. # 打印出响应状态码 服务器返回结果
  34. print("登录结果返回结果",r.status_code,r.json())
  35. # 登陆成功 之后将token 设置变量 r.json()["data"] 返回结果中的token值
  36. test_data["token"] = r.json()["data"] # 更改testdata["token"] 的值
  37. def test_search():
  38. url = "http://49.233.108.117:28019/api/v1/search"
  39. query_data={
  40. "keyword":"iphone"
  41. }
  42. token_header={
  43. "token": test_data["token"] # 引用testdata["token"] 值
  44. }
  45. print('查询结果中的请求头',token_header)
  46. r = requests.get(url,params=query_data,headers=token_header)
  47. print('查询结果: ',r.json())
  48. if __name__ == '__main__':
  49. # 注册和登录的时候需要使用到同一个手机号码
  50. test_register()
  51. test_login()
  52. test_search()

其他上下游传参方式

使用return返回值

  1. # 随机函数
  2. import random
  3. # # 定义字典 可以通过修改 key 对应的value
  4. # data = {
  5. # "rn": 0
  6. # }
  7. def f1():
  8. # 随机生成一个数字
  9. num = random.randint(1,100000)
  10. # 修改字典中 rn字段的值
  11. # data.append(num)
  12. print(f'f1 生成随机数字 {num}')
  13. return num
  14. def f2():
  15. """
  16. 需要将 f1函数中生成 随机数字 传递过来,进行使用。
  17. :return:
  18. """
  19. num = f1()
  20. print(f'f2 使用f1生成的随机数字:{num}')
  21. def f3():
  22. """
  23. 需要将 f1函数中生成 随机数字 传递过来,进行使用。
  24. :return:
  25. """
  26. num = f1()
  27. print(f'f3 使用f1生成的随机数字:{num}')
  28. if __name__ == '__main__':
  29. f1()
  30. f2()
  31. f3()

通过return 返回值 也可以传参 但是f1会执行多次
image.png

使用global 关键字

global 可以将局部变量设置为全局变量

  1. # 随机函数
  2. import random
  3. def f1():
  4. global num # 将局部变量设置全局变量
  5. # 随机生成一个数字
  6. num = random.randint(1,100000)
  7. print(f'f1 生成随机数字 {num}')
  8. def f2():
  9. """
  10. 需要将 f1函数中生成 随机数字 传递过来,进行使用。
  11. :return:
  12. """
  13. print(f'f2 使用f1生成的随机数字:{num}')
  14. if __name__ == '__main__':
  15. f1()
  16. f2()

image.png
global 可以将局部变量设置为全局变量。
缺点就是 你在写代码引用变量的时候,不会有代码提示, 容易写错。

通过文件存储

将参数写入文件中。

  1. # 随机函数
  2. import random
  3. def f1():
  4. # 随机生成一个数字
  5. num = random.randint(1,100000)
  6. # 将数据写入到 文件中
  7. with open('./data.txt',mode='w') as file:
  8. file.write(str(num))
  9. print(f'f1 生成随机数字 {num}')
  10. def f2():
  11. """
  12. 需要将 f1函数中生成 随机数字 传递过来,进行使用。
  13. :return:
  14. """
  15. with open('./data.txt',mode='r') as file:
  16. num = file.read()
  17. print(f'f2 使用f1生成的随机数字:{num}')
  18. if __name__ == '__main__':
  19. f1()
  20. f2()

这样做 每次都要读写文件 比较麻烦。