You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:04:53