python踩坑记-01
2019-04-30 本文已影响0人
vilian_acfc
1、httprunner接口自动化调试发现requests发起post请求时,参数被加上\,导致服务端不能正常解析json
{\\"department_id\\":\\"\\"}
排查过程:
1、调用方法:requests.Session.request
2、追踪调用链requests.Session.request -> requests.Session.prepare_request -> requests.models.prepare ->requests.models.prepare_body ,prepare_body中源码如下:
if not data and json is not None:
# urllib3 requires a bytes-like body. Python 2's json.dumps
# provides this natively, but Python 3 gives a Unicode string.
content_type = 'application/json'
body = complexjson.dumps(json) # 经调试参数经过该方法后被加上了\
if not isinstance(body, bytes):
body = body.encode('utf-8')
3、继续查看complexjson.dumps方法,调用了json.encoder.encode方法,encode的源码:
# This is for extremely simple cases and benchmarks.
if isinstance(o, str):
if self.ensure_ascii:
return encode_basestring_ascii(o) #调试发现进入了按ascii编码,说明是由于参数是str类型导致
else:
return encode_basestring(o)
4、已基本发现问题,由于发起requests的post请求时,参数是str类型导致,修改如下:
return "".join((tpl.render(**kwargs).split())) #修改前
return json.loads("".join((tpl.render(**kwargs).split()))) #修改后
重跑,问题解决!!!!