使用Requests库POST JSON数组时如何正确进行URL编码
问题原因
- 你需要的是
application/x-www-form-urlencoded格式的POST请求,请求体仅包含一个名为data的表单字段,字段值为目标数组的JSON序列化结果 - 之前的两种用法均不符合请求格式要求:
- 直接将JSON字典传给
data参数:requests会将字典的键值对拆分为独立表单字段,遇到数组类型的值会遍历展开,因此出现data=item_price_id&data=item_name的错误结果 - 使用
json参数传值:requests会直接将请求体设置为JSON格式,Content-Type自动改为application/json,与要求的表单格式完全不符
- 直接将JSON字典传给
正确处理方式
步骤1:导入依赖
import json import requests
步骤2:准备数组数据并序列化为JSON字符串
注意设置ensure_ascii=False避免希伯来文被转义为\uXXXX格式,保证编码结果符合预期:
payload_array = [ { "item_price_id": "477ABC8E-510F-4412-8F67-B1E2B9EDDC5E", "item_name": "כרטיס לסרט בסינמה סיטי למימוש בימי חמישי בלבד", "benefit_full_price": 30, "benefit_discount_price": 9, "benefit_vip_full_price": 0, "benefit_vip_discount_price": 0, "item_use_credit": 1, "user_level_type": 0, "member_type_name": "", "item_show_id": "3E3FD8CF-3D28-47D7-BEE3-C08AA8474F95", "item_hall_id": None, "item_hall_name": None, "item_show_date": None, "item_show_time": None, "item_is_limit": 0, "item_limit": 0, "limit": 100000000000, "user_level": 0, "user_limit": 0, "show_limit": 100000000000, "is_user": "" } ] # 序列化为JSON字符串,不转义非ASCII字符 json_str = json.dumps(payload_array, ensure_ascii=False)
步骤3:构造表单字典并发起请求
将JSON字符串作为data字段的值构造表单字典,传给requests的data参数即可:
form_data = {"data": json_str} response = requests.post("你的目标接口地址", data=form_data)
验证请求内容(可选)
如果需要确认实际发送的请求体是否符合预期,可以通过PreparedRequest查看:
req = requests.Request('POST', '你的目标接口地址', data=form_data) prepared_req = req.prepare() # 打印实际发送的请求体,和你预期的编码格式一致 print(prepared_req.body)
内容的提问来源于stack exchange,提问作者JustAGuy
相关产品推荐
相关产品推荐

