调用Watch2Gether API时urllib.request.Request恒返回HTTP 400错误
错误原因
- 核心问题是请求头声明的格式和实际请求体格式不匹配:你在headers中设置了
Content-Type: application/json,但实际用urllib.parse.urlencode()将参数序列化成了application/x-www-form-urlencoded格式的表单数据,服务端收到请求后按照JSON格式解析body失败,直接返回400 Bad Request。 - 不传headers时请求正常的原因:urllib发送带请求体的POST请求时,如果没有手动指定Content-Type,会自动添加
Content-Type: application/x-www-form-urlencoded的默认请求头,和你实际传输的表单格式参数匹配,服务端可以正常解析,因此请求成功。官方文档虽然要求传JSON格式,但服务端实际兼容了表单格式的传参方式。
修复方案
有两种可选修复方式,任选其一即可:
方案1:继续使用表单传参
删除手动定义的headers变量,或者将headers中的Content-Type改为application/x-www-form-urlencoded即可,其余代码无需修改。
方案2:严格遵循文档要求使用JSON传参
将请求体的序列化方式从urlencode改为json序列化,和你声明的Content-Type匹配,修改对应方法中data的生成逻辑即可,示例修改点:
# createroom方法原来的代码 # data = urllib.parse.urlencode(body_create).encode("utf-8") # 修改为 data = json.dumps(body_create).encode("utf-8") # updateroom方法同理修改data生成逻辑 # data = urllib.parse.urlencode(body_update).encode("utf-8") # 修改为 data = json.dumps(body_update).encode("utf-8")
另外建议修改代码中用dict作为变量名的写法,dict是Python内置类型的关键字,用作变量名可能引发不可预期的问题,建议替换为res_data之类的自定义名称。
内容的提问来源于stack exchange,提问作者rndnewbiee22
相关产品推荐
相关产品推荐

