先来整理下我们目前已完成的材料:
普通接口,选择加登陆态:
登陆态接口可以正常获取返回提取字段:
然后我们去后台的views.py中找到调试普通接口的那个函数Api_send
首先,这个函数内容已经非常非常庞大了,现在我们要考虑怎么改:
- 获取前端这个登陆态加不加的开关的状态
- 如果关那么就没事,什么都不动
- 如果是开的,那么就要去调用登陆态接口请求,拿到返回提取字段回来插入到url,请求头和请求体里。
- url和请求头很好插入,但是请求体怎么办呢?请求体的种类好多,每种的的插入方法都不一样,甚至很麻烦。
这里我就简单说下,可以插入也可以不插,插入的也只有row_json 和 form-data,x-www 三种。大多数接口的url中插入后,服务器就会认了。这和服务器具体代码有关。但是本文既然作为教程,所以就全会写,小伙伴别嫌麻烦,这工程量的确巨大。
先完成前三步:
我们现在去看看登陆态接口的发送函数
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,所以也不知道去调用哪个项目的登陆态了。
这里我们有俩种方式解决:
- 回到html中,给加上项目id
- 看到有api_id,那么根据api_id查到所属项目id,
这里为了简便,就用第二种方法了,完成如下:
我们重启服务,来实际请求一下这个普通接口,看看能否输出得到的登陆态参数:
可以看到,获取成功了~
那么接下来我们要给它插入到url 和 header里了:
首先是url,url要分为有没有?号,也就是有没有已经带了参数,没有带我们要手动加上?
一定要注意上下文位置,这段代码的位置是放在拼接url之后,正式请求之前。
注意,这里插播一条缺陷修复,就是请求头为空时候 我们不再报错返回,而是当作无请求头进行:
接下来我们请求一下看看url是否成功加入登陆态参数:
可以看到,已经成功加上了。
然后是header:
header就更好办了:
打印看看效果:
可以看到,也成功加了进来了~