最近在做requests请求时遇到如下报错:
{"code":"500","message":"JSON parse error: Cannot construct instance of `com.bang.erpapplication.domain.User` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{\"name\":\"aa12345\", \"pwd\":\"lemon666\", \"age\":18, \"email\":\"121313927@qq.com\", \"phone\": \"15086666888\"}'); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.bang.erpapplication.domain.User` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{\"name\":\"aa12345\", \"pwd\":\"lemon666\", \"age\":18, \"email\":\"121313927@qq.com\", \"phone\": \"15086666888\"}')\n at [Source: (PushbackInputStream); line: 1, column: 1]"}
调查了半天,发现是requests调用post方法时,data参数和json参数没搞明白。下面做一下梳理。
接口需求是: 请求格式为application/json。之前测试的接口用的是application/x-www-form-urlencoded格式,使用data传字典,得到响应结果
这次使用json数据传参,可以使用json和data两种方式
json和dict
python中并没有json类型这一说法,使用json.dumps(dict)将dict转换成json格式,得到字符串对象
虽说json格式的数据在python中以字符串类型存在,但是通过str(dict)得到的结果和json.dumps(dict)得到的结果是不相同的
可以看出来json格式的数据,除了要满足字典类型的格式外,字符串对象必须要双引号
requests的post请求
如果请求的数据格式为json,有2种方式:
1). 字典格式定义数据,使用json.dumps(dict)转换成json数据,使用data参数进行报文提交
2). 直接使用json参数传字典进行报文提交
如果使用json=json.dumps(data)就会报最开始的错误
可以在headers定义{"Content-Type": "application/json"}并传输,实测不传也没什么问题
其他
在requests.get()方法中可以使用params参数传递数据,有时候请求结果会呈现乱码的状态,可以通过res的encoding属性查看编码方式。
在获取res.text之前对res.encoding='utf-8'赋值,这样就可以解决请求结果乱码的问题