本节我们要搞定普通接口调试时自动加入登陆态接口返回参数到请求头/体中的后台实现。
先来整理下我们目前已完成的材料:
普通接口,选择加登陆态:
登陆态接口可以正常获取返回提取字段:
然后我们去后台的views.py中找到调试普通接口的那个函数Api_send
首先,这个函数内容已经非常非常庞大了,现在我们要考虑怎么改:
先完成前三步:
我们现在去看看登陆态接口的发送函数:
project_login_send
这个函数目前,接收的是登陆态接口设置弹层前端给的请求参数。而我们现在直接调用,很显然我们是想让他用数据保存的请求参数来请求。
而且返回值也不能扔给前端了,而是正常返回给调用函数。所以虽然看起来差不多,但是还是再贴着写一个新的供调用的登陆态请求函数比较好,何况后期我们会对这个函数进行各种改造。
新建函数,完全复制,之后再改:
然后给....for_other改成这样:
# 调用登陆态接口
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 {}
如图,修改的部分一是获取请求数据改成了从数据库拿,所以这个函数的入参改成了project_id,然后是最后结果返回,之前是一串字符串文案,现在是一个字典,出错就回空字典。
然后我们回到api_send函数中,调用这个新登陆态请求for_other函数:
如图,我们发现了一个设计上的问题,就是请求函数并没有项目id,所以也不知道去调用哪个项目的登陆态了。
这里我们有俩种方式解决:
这里为了简便,就用第二种方法了,完成如下:
我们重启服务,来实际请求一下这个普通接口,看看能否输出得到的登陆态参数:
可以看到,获取成功了~
那么接下来我们要给它插入到url 和 header里了:
首先是url,url要分为有没有?号,也就是有没有已经带了参数,没有带我们要手动加上?
一定要注意上下文位置,这段代码的位置是放在拼接url之后,正式请求之前。
注意,这里插播一条缺陷修复,就是请求头为空时候 我们不再报错返回,而是当作无请求头进行:
接下来我们请求一下看看url是否成功加入登陆态参数:
可以看到,已经成功加上了。
然后是header:
header就更好办了:
打印看看效果:
可以看到,也成功加了进来了~
今天的内容到此结束。下节课我们完成 加入到各种类型的请求体中。