Api_处理接口依赖(登录状态)
2016-08-26 本文已影响832人
古佛青灯度流年
Paste_Image.png
-
处理接口依赖
-
在做接口的过程中,处理接口间的依赖很常见,这里要说的是处理下个接口依赖登录状态的情况:
例:
分析问题:
接口B调用的前提条件是当前用户必须是登录状态,而用户登录是由接口A完成的,所以我们要做的就是在调用接口B之前需要先调用接口A,并且获得用户的登录状态,就我现在公司来说,服务端校验登录状态是根据当前用户的{_identity,PHPSESSID,user_type} 的key和value值决定的,换句话说就是服务端只要找到这3个key的值就认为当前用户处于登录状态,只需要在请求接口的时候在Header中加入这些就可以了。
解决问题:既然知道了,原理就开始吧。
-
首先要想办法获取调用接口A时,服务端植入的cookie,从而找到{_identity,PHPSESSID,user_type} 的key和value值;
import urllib, urllib2, cookielib #域名 main_domain =http://www.baidu.com #传递参数 parameter={"r": "A", "phone": "13111111117", "passcode": "1234", "user_type": "100"} def getCookie(cls, parameter): u'获取cookie内容' #解析传参 params = urllib.urlencode(parameter) #拼装get方法的url url = main_domain+'/index.php?'+params #调用cookielib函数,获取cookie cookie = cookielib.CookieJar() handle = urllib2.HTTPCookieProcessor(cookie) opener = urllib2.build_opener(handle) opener.open(url) print "cookie"+str(cookie) #定义一个空字符串d,下边要用到 d = "" #通过该方法获取cookie中的key、value for item in cookie: name = item.name value = item.value #拼装成固定格式 key = value dic = name + "=" + value #拼装字符串 d = dic+";"+d log.debug(u'输出cookie:' + str(d)) #生成Header字典 dic1 = {"Cookie": d} print "dic1="+str(dic1)输入结果:
cookie:PHPSESSID=rbeijkuu2e17b3i5j8gj81sim0;user_type=100;_identity=30adfe321230af6cf67c4b55f456c38ec9977a163b1dfeb20b3a928e767f0419a%3A2%3A%7Bi%3A0%3Bs%3A9%3A%22_identity%22%3Bi%3A1%3Bs%3A21%3A%22%5B488696%2Ctrue%2C2592000%5D%22%3B%7D;dic1={Cookie:PHPSESSID=rbeijkuu2e17b3i5j8gj81sim0;user_type=100;_identity=30adfe321230af6cf67c4b55f456c38ec9977a163b1dfeb20b3a928e767f0419a%3A2%3A%7Bi%3A0%3Bs%3A9%3A%22_identity%22%3Bi%3A1%3Bs%3A21%3A%22%5B488696%2Ctrue%2C2592000%5D%22%3B%7D;}
-
注意:在添加Header的时候最好去浏览器中看一下接口Header的格式,
请求格式.png
比如我这里的Request Header格式为:Cookie:key=value;key1=value ,显而易见这是字典的格式,这样看就更明显了{Cookie:key=value;key1=value} 所以我在拿到cookie的value的以后,又将他们组装成为指定格式的字典,这点很重要!(我在这掉坑里面了) -
接下来就是将Header中加入指定k和v
parameter = {"r": "B", "demand_id": '2938'} def getInterface( parameter=None, headers={}): u''' parameter = {"r": "demand/info", "demand_id": '2938'}格式 ''' #获取请求url get_url = main_domain+'/index.php?' #解析请求参数 params = urllib.urlencode(parameter) send_url = get_url + params #访问接口 req = urllib2.Request(send_url, headers=headers) #打印请求日志: httpHandler = urllib2.HTTPHandler(debuglevel=1) httpsHandler = urllib2.HTTPSHandler(debuglevel=1) opener = urllib2.build_opener(httpHandler, httpsHandler) urllib2.install_opener(opener) #读取返回值 response = urllib2.urlopen(req).read() #以json格式读取 jresult = json.loads(response) print response print jresult
调用:
getInterface(parameter=parameter,headers=dic1)
-
完成
@晴天-2016-08-30 20:59:46 (后补)