向requests请求payload传递参数失败问题排查
问题分析与解决
你的问题出在动态生成cart参数的JSON字符串时格式不合法,对比手动编写的正确格式,核心问题有两个:
- 字符串类型的参数(比如
item_url)未添加双引号,导致JSON语法错误 - 用
str()直接转换字典会生成单引号,不符合JSON要求的双引号规范
错误写法的具体问题
第一种拼接方式生成的cart_value会是:
[{ "id":12345, "quantity":1, "url_id": test_name}]
这里test_name没有引号,属于非法JSON;第二种写法用str(dict)生成的内容是:
'[{'id': 12345, 'quantity': 1, 'url_id': 'test_name'}]'
单引号不符合JSON语法,且外层引号拼接逻辑混乱。
正确解决方法
最稳妥的方式是用json.dumps()将Python对象转为标准JSON字符串,无需手动拼接,自动处理引号和类型兼容:
import json import random import string import requests def add_to_cart(item_id, item_url): # 先构造Python原生的列表+字典结构 cart_data = [{"id": item_id, "quantity": 1, "url_id": item_url}] # 转换为符合规范的JSON字符串 cart_value = json.dumps(cart_data) payload = { "email": 'email@mail.com', "fname": 'firstName', "lname": 'lastName', "session_id": ''.join(random.choice(string.digits) for _ in range(10)), "cart": cart_value, } response = requests.post("urlHere", headers={ "User-Agent": userAgent }, data=payload) print(f"add to cart: {response.text}") print(f"add to cart: {response.status_code}") add_to_cart(12345, "test_name")
如果一定要手动拼接字符串,需确保字符串类型参数添加双引号,同时注意数字/字符串类型的兼容:
# 当item_id是数字时的写法 cart_value = f'[{{ "id":{item_id}, "quantity":1, "url_id": "{item_url}" }}]' # 当item_id是字符串时,要给item_id也加引号 # cart_value = f'[{{ "id":"{item_id}", "quantity":1, "url_id": "{item_url}" }}]'
验证效果
生成的cart_value会和你手动编写的合法格式完全一致:
'[{ "id":12345, "quantity":1, "url_id":"test_name" }]'
内容的提问来源于stack exchange,提问作者jedlem
相关产品推荐
相关产品推荐

