如何将PHP curl_setopt_array转换为Python代码并修复参数错误
问题根因
你的Python代码和可运行的PHP代码存在几个关键的行为差异,导致接口校验失败:
- 第一次尝试直接传
data=data:requests会自动将字典编码为key=value&key2=value格式的表单数据,而PHP实际发送的是原始JSON字符串作为请求体,格式完全不匹配。 - 第二次尝试把参数放到请求头中:接口从POST请求体读取参数,无法从头中获取到有效参数。
- 第三次尝试用
json=data传参:这个参数会让requests自动将数据序列化为JSON,同时自动添加Content-Type: application/json请求头,但PHP代码从未设置过这个头,使用的是curl默认的application/x-www-form-urlencoded头,该接口对Content-Type存在不规范的强校验,头不匹配就直接返回参数错误。 - 其他细节差异:PHP代码强制指定了HTTP 1.1协议、允许跟随重定向、自动适配压缩编码,这些配置如果不对齐也可能触发异常。
可直接运行的等效Python代码
完全对齐PHP curl的所有行为:
import requests import json # 构造请求参数,和PHP代码完全一致 req_data = { 'api_key': 'APIKEY', 'sender': '6285157853022', 'number': '082136815088', 'message': 'the message' } target_url = "http://wa.mydomain.id/wa/app/api/send-message" # 手动序列化JSON,对齐PHP json_encode的输出格式:无多余空格、不强制转义非ASCII字符 json_payload = json.dumps(req_data, separators=(',', ':'), ensure_ascii=False) # 请求头对齐PHP curl默认值:不声明JSON类型,使用默认表单类型头 req_headers = { 'Content-Type': 'application/x-www-form-urlencoded' } # 对齐所有curl配置项 response = requests.post( target_url, data=json_payload, # 直接传序列化后的JSON字符串,不使用json参数 headers=req_headers, allow_redirects=True, # 对齐CURLOPT_FOLLOWLOCATION=true timeout=None, # 对齐CURLOPT_TIMEOUT=0(永不超时) ) print(response.text)
排查说明
如果运行后依然报错,可以打印Python实际发出的原始请求内容,和PHP侧抓取的请求逐字段对比:
# 打印实际发送的请求头 print("请求头:", response.request.headers) # 打印实际发送的请求体 print("请求体:", response.request.body)
只要保证请求头、请求体、请求方法和PHP发出的完全一致,就能得到和PHP代码相同的成功响应。
内容的提问来源于stack exchange,提问作者Fian Julio
相关产品推荐
相关产品推荐

