Python Requests POST请求报400错误:JSON格式问题排查求助
Python POST请求返回400错误:JSON解析失败问题排查
问题背景
尝试用Python requests复刻一段可正常运行的PowerShell POST请求,但始终返回400错误,提示unexpected token r in JSON at position 0。
PowerShell参考代码
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession $session.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 YaBrowser/24.1.0.0 Safari/537.36" Invoke-WebRequest -UseBasicParsing -Uri "https://url/api/auth" ` -Method "POST" ` -WebSession $session ` -Headers @{ "Accept"="*/*" "Accept-Encoding"="gzip, deflate, br" "Accept-Language"="ru,en;q=0.9" "Cache-Control"="max-age=0" "Origin"="url" "Referer"="url" "Sec-Fetch-Dest"="empty" "Sec-Fetch-Mode"="cors" "Sec-Fetch-Site"="same-origin" "sec-ch-ua"="`"Not_A Brand`";v=`"8`", `"Chromium`";v=`"120`", `"YaBrowser`";v=`"24.1`", `"Yowser`";v=`"2.5`"" "sec-ch-ua-mobile"="?0" "sec-ch-ua-platform"="`"Windows`"" } ` -ContentType "application/json" ` -Body ([System.Text.Encoding]::UTF8.GetBytes("{`"rememberMe`":false,`"version`":{`"date`":`"2024-02-09T17:00:00.000Z`",`"company`":`"$([char]1054)$([char]1054)$([char]1054) \`"$([char]1090)\`"`"`, `"number`":`"8.8.1`"},`"eng`":false,`"username`":`"xxx`",`"password`":`"xxx`"}"))
用户编写的Python代码
post_login_url = 'url' auth_values = { "rememberMe": "false", "version": { "date": "2024-02-09T10:00:00.000Z", "company": "ООО \"А\"", "number": "8.8.1"}, "eng": 'false', "username": ab_username, "password": ab_password} headerscont = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 YaBrowser/24.1.0.0 Safari/537.36", "accept": "*/*", "accept-language": "ru,en;q=0.9", "cache-control": "max-age=0", "content-type": "application/json", "sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"YaBrowser\";v=\"24.1\", \"Yowser\";v=\"2.5\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "same-origin", "Referer": "url", "Referrer-Policy": "strict-origin-when-cross-origin" } with HTMLSession() as session: post = session.post(post_login_url, headers=headerscont, data=auth_values)
错误原因及修正方案
1. 请求体传递方式错误
requests的data参数会将字典序列化为application/x-www-form-urlencoded格式的表单数据,但服务器要求的是application/json格式,这是导致JSON解析错误的核心原因。
修正:使用json参数替代data,requests会自动将字典序列化为JSON字符串,并正确匹配服务器要求的内容格式。
2. 布尔值类型错误
PowerShell代码中的rememberMe和eng是布尔值false,但Python代码中写成了字符串"false",导致JSON结构不符合服务器预期。
修正:将"false"改为Python布尔值False。
3. 缺失关键请求头
对比PowerShell的请求头,Python代码缺少Origin和Accept-Encoding两个头,部分服务器会严格校验这些跨域或内容编码相关的头信息。
修正:在headerscont中添加这两个头。
4. 日期参数不一致
PowerShell中的version.date是2024-02-09T17:00:00.000Z,而Python中是2024-02-09T10:00:00.000Z,时间差异可能导致服务器验证失败。
修正:将Python中的日期值调整为和PowerShell一致。
修正后的Python代码
from requests_html import HTMLSession post_login_url = 'https://url/api/auth' ab_username = "xxx" ab_password = "xxx" auth_values = { "rememberMe": False, "version": { "date": "2024-02-09T17:00:00.000Z", "company": "ООО \"А\"", "number": "8.8.1"}, "eng": False, "username": ab_username, "password": ab_password } headerscont = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 YaBrowser/24.1.0.0 Safari/537.36", "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "ru,en;q=0.9", "Cache-Control": "max-age=0", "Origin": "url", "Referer": "url", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"YaBrowser\";v=\"24.1\", \"Yowser\";v=\"2.5\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"" } with HTMLSession() as session: post = session.post(post_login_url, headers=headerscont, json=auth_values) # 可打印响应内容排查问题 print(post.status_code) print(post.text)
内容的提问来源于stack exchange,提问作者LanMorehell
相关产品推荐
相关产品推荐

