接口测试 接口测试 requests get 方法的 data 与 params 问题。

0x7C00 · 2016年07月28日 · 最后由 0x7C00 回复于 2016年07月29日 · 3114 次阅读

问题

最近在做接口测试,遇到一个问题,有 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)
......

问题就出现在 params 上 ,开始以为用 data 或者 params 纯属个人习惯,所以就没在意。
错误方式:
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。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 8 条回复 时间 点赞


这是我看到的源码:

我的 requests 的版本是 2.10.

对于 get 请求是没有 body 的,post 的数据都会在 body 里面。

这不是坑,是你没懂这两个参数的区别

#1 楼 @among29 恩呢,我的也是 2.10,直接 get 会显示 params 参数,如果是 requests.Session().get(),就不显示勒。谢谢

data 是放在 post 的 body 里面,你可以看下我的 http 接口测试框架

—— 来自 TesterHome 官方 安卓客户端

#2 楼 @jacexh 😅 确实是没太懂 2 个的区别,谢了。

正常来说,GET 方法的 http body 服务器都不去读取的。因为 GET 传输数据本来就应该通过 url 的 prarameters 来传。如果要通过 http body 来传,应该用 POST 。

可以参考 http://www.w3school.com.cn/tags/html_ref_httpmethods.asp

不过这么传有个坑,有些浏览器的 url 有最大长度限制。

#7 楼 @chenhengjie123 恩恩,已看,谢啦。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册