问题
最近在做接口测试,遇到一个问题,有 A 与 B 两个接口,都是 get 请求,status:200,其中 B 依赖于 A 请求返回的 cookies。
解决
用 session 方法保持会话对象,跨请求保持参数。也会在同一个 Session 实例发出的所有请求之间保持 cookies。
s = requests.Session()
代码 demo
......
self.query_string_parameter = {
'callback': 'xxxxxx',
'source': 'http://xxxxxxxx',
'data': '{"cart_type":0,"is_simple":true,"return_cart_data":false,"version":1,\
"product_list":[[{"sm_seq":"xxxxxxxxxx","type":0,"qty":1,"parent_seq":"","kind":1,"campaign_seq":""}]]}',
'_': '1450764482330',
}
self.s.get(self.minicart_url, data=self.query_string, headers=self.headers) # A接口
resp = self.s.get(self.buy_url, params=self.query_string_parameter, headers=self.headers) #B接口
print (resp.content)
......
坑
resp = self.s.get(self.buy_url, data=self.query_string_parameter, headers=self.headers)
因为 requests get 方法的源码,并没有特别指定使用 params 参数。
def get(self, url, **kwargs):
"""Sends a GET request. Returns :class:`Response` object.
:param url: URL for the new :class:`Request` object.
:param \*\*kwargs: Optional arguments that ``request`` takes.
"""
kwargs.setdefault('allow_redirects', True)
return self.request('GET', url, **kwargs)
但是使用 data,请求的 response 一直无有效数据(B 接口是加入购物车的功能,结果是加入失败)。
用 fiddler 抓包看下,原来 data 和 params get 的 url 时是有区别的。
使用 params 时:
GET http://buy.beta1.fn/cartApi/addList?callback=jQuery111104286307209996918_1450684422808&data=%7B%22cart_type%22%3A0%2C%22is_simple%22%3Atrue%2C%22return_cart_data%22%3Afalse%2C%22version%22%3A1%2C%09%09%09%22product_list%22%3A%5B%5B%7B%22sm_seq%22%3A%22201509CM170000043%22%2C%22type%22%3A0%2C%22qty%22%3A1%2C%22parent_seq%22%3A%22%22%2C%22kind%22%3A1%2C%22campaign_seq%22%3A%22%22%7D%5D%5D%7D&_=1450764482330&source=http%3A%2F%2Fitem.beta1.fn%2F201509CM170000043 HTTP/1.1
.......
.......
.......
使用 data 时:
GET http://buy.beta1.fn//cart/minicart HTTP/1.1
.......
.......
.......
因为服务器端只能解析第一种拼接的 url 查询参数,而对于第二种在请求报文中带的查询参数,无法解析。所以使用 data,一直没有正确的 response,踩坑结束。
总结
一直很纠结,这 2 个 keyword 到底有什么区别,搜索了下链接
看到这样的解释:params form the query string in the URL, data is used to fill the body of a request 但是还是不太明白。
希望高手能帮忙解答下,到底有什么区别?非常感谢!
已解决!Thank you guys。