参考大佬文章:112
函数Api_send:
获取前端这个登陆态加不加的开关的状态如果关那么就没事,什么都不动
如果是开的,那么就要去调用登陆态接口请求,拿到返回提取字段回来插入到url,请求头和请求体里。
url和请求头很好插入,但是请求体怎么办呢?请求体的种类好多,每种的的插入方法都不一样,甚至很麻烦。
这里我就简单说下,可以插入也可以不插,插入的也只有row_json 和 form-data,x-www
三种。大多数接口的url中插入后,服务器就会认了。这和服务器具体代码有关。
获取前端这个登陆态加不加的开关的状态
新建一个新的调用登录态请求函数–project_login_send_for_other
# 调用登陆态接口--从数据库获取请求数据,入参改为project-id,返回字典,出错就返回空字典
def project_login_send_for_other(project_id):
# 第一步,获取数据
login_api = DB_login.objects.filter(project_id=project_id)[0]
login_method = login_api.api_method
login_url = login_api.api_url
login_host = login_api.api_host
login_header = login_api.api_header
login_body_method = login_api.body_method
login_api_body = login_api.api_body
login_response_set = login_api.set
# 第二步,发送请求
try:
header = json.loads(login_header) # 处理header
except:
return HttpResponse('请求头不符合json格式!')
# 拼接完整url
if login_host[-1] == '/' and login_url[0] == '/': # 都有/
url = login_host[:-1] + login_url
elif login_host[-1] != '/' and login_url[0] != '/': # 都没有/
url = login_host + '/' + login_url
else: # 肯定有一个有/
url = login_host + login_url
try:
if login_body_method == 'none':
response = requests.request(login_method.upper(), url, headers=header, data={})
elif login_body_method == 'form-data':
files = []
payload = {}
for i in eval(login_api_body):
payload[i[0]] = i[1]
response = requests.request(login_method.upper(), url, headers=header, data=payload, files=files)
elif login_body_method == 'x-www-form-urlencoded':
header['Content-Type'] = 'application/x-www-form-urlencoded'
payload = {}
for i in eval(login_api_body):
payload[i[0]] = i[1]
response = requests.request(login_method.upper(), url, headers=header, data=payload)
elif login_body_method == 'GraphQL':
header['Content-Type'] = 'application/json'
query = login_api_body.split('*WQRF*')[0]
graphql = login_api_body.split('*WQRF*')[1]
try:
eval(graphql)
except:
graphql = '{}'
payload = '{"query":"%s","variables":%s}' % (query, graphql)
response = requests.request(login_method.upper(), url, headers=header, data=payload)
else: # 这时肯定是raw的五个子选项:
if login_body_method == 'Text':
header['Content-Type'] = 'text/plain'
if login_body_method == 'JavaScript':
header['Content-Type'] = 'text/plain'
if login_body_method == 'Json':
header['Content-Type'] = 'text/plain'
if login_body_method == 'Html':
header['Content-Type'] = 'text/plain'
if login_body_method == 'Xml':
header['Content-Type'] = 'text/plain'
response = requests.request(login_method.upper(), url, headers=header, data=login_api_body.encode('utf-8'))
# 把返回值传递给前端页面
response.encoding = "utf-8"
DB_host.objects.update_or_create(host=login_host)
res = response.json()
# 第三步,对返回值进行提取
get_res = {} # 声明提取结果存放
for i in login_response_set.split('\n'):
if i == "":
continue
else:
i = i.replace(' ', '')
key = i.split('=')[0] # 拿出key
path = i.split('=')[1] # 拿出路径
value = res
for j in path.split('/')[1:]:
value = value[j]
get_res[key] = value
return get_res
except Exception as e:
return {}
api_send函数
获取请求数据改成了从数据库拿
请求函数根据api_id查到所属项目id
插入url:
url要分为有没有?号,也就是有没有已经带了参数,没有带我们要手动加上?
在拼接url后,正式请求前
插入header:
修复bug
请求头为空时不再报错返回,当作无请求头进行
# 发送请求获取返回值
if ts_header == '':
ts_header = '{}'
try:
header = json.loads(ts_header)
except:
return HttpResponse('请求头不符合json格式!')