使用Python Requests模块发送数据时遇Converting Value Error
解决Python Requests发送POST请求时的Converting Value Error问题
看起来你遇到的问题是服务器无法解析你发送的请求体,咱们一步步拆解原因和解决办法:
错误原因分析
先看错误信息里最核心的部分:
Error converting value "{"price": 64, ...}" to type 'System.Collections.Generic.List`1[DataTransferObjects.Listings.CreateOutSourcedListingModel]'
这个提示已经说得很清楚了:服务器期望接收的是一个List(也就是JSON数组)类型的数据,但你发送的是单个JSON对象。另外你的代码里还有个小坑:你先用json.dumps()把字典转成了JSON字符串,又传给了requests的json参数——这个参数本身会自动把Python对象序列化为JSON,这么做相当于把JSON字符串又转成了一个带引号的字符串值,直接导致请求体格式完全不符合要求。
再对照服务器文档的请求格式,参数部分明确是数组结构:
[ { "price": 0, ... }, ... ]
修复方案
你只需要做两个关键调整:
- 把单个的
data字典放到一个列表(数组)里,匹配服务器要求的List类型 - 直接把Python列表传给requests的
json参数,不需要自己调用json.dumps()
修正后的代码示例
token = self.get_token() create_listing_path = "api/v1/listings/createlistings" create_listing_url = "https://staging.lab.xxx.com/" + create_listing_path bearer = "Bearer "+str(token) headers = {'Content-Type': 'application/json', 'Authorization': bearer} fiyat = kart.urun.satis_fiyat stok = kart.stok son_kullanma = kart.expiration barkod = kart.urun.barkod urun_adi = kart.urun.urun_adi # 将单个字典包裹进列表,符合服务器要求的List类型 data = [ { 'price': int(fiyat), 'stock': int(stok), 'expiration': str(son_kullanma), 'product': { 'name': urun_adi, 'barcode': barkod } } ] # 直接传Python列表给json参数,requests会自动帮你序列化为正确的JSON格式 r = requests.request("POST", str(create_listing_url), json=data, headers=headers) # 可以打印响应结果验证是否成功 print(r.json())
额外小提示
- 如果之后需要批量创建多个listing,只需要在
data列表里添加更多字典对象就行,完全适配接口的批量处理逻辑 - 关于
expiration字段,服务器示例用的是"2019-06-21T13:37:40.291Z"这种标准ISO格式,你当前的"2021-08-18 17:41:50.956382+00:00"格式应该也能被解析,但如果之后遇到日期格式错误,可以试试用datetime模块的isoformat()方法转换为标准格式
内容的提问来源于stack exchange,提问作者Tech
相关产品推荐
相关产品推荐

