python踩坑记-01

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())))   #修改后

重跑,问题解决!!!!

你可能感兴趣的:(python踩坑记-01)