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

调用德国公共广播媒体API遇400错误,求Python代码纠错

解决mediathekviewweb API POST请求400错误问题

问题背景

调用https://mediathekviewweb.de/api/query接口获取德国公共广播媒体中心的电影数据,参考提供的JavaScript示例编写Python代码时,使用requests库发送POST请求始终返回400错误,报错信息为'Unexpected token o in JSON at position 1'。尝试直接传入序列化后的JSON字符串、构造查询字典后序列化再传入两种写法均失败。

错误原因

requests库的post方法中,json参数的作用是自动将Python字典序列化为JSON格式字符串,并自动设置请求头Content-Type: application/json。如果传入已经通过json.dumps()序列化后的字符串,requests会将这个字符串再次进行JSON序列化,导致服务器收到嵌套的JSON(例如"{...}"),解析时触发语法错误,出现Unexpected token o的报错。

此外,Python代码2中错误地将content-type放在请求体字典里,该参数属于请求头配置,不应出现在请求体中。

修正后的代码

写法一:直接传入Python字典(推荐)

利用requests内置的JSON处理能力,自动完成序列化和请求头设置,代码简洁不易出错:

import requests

url = "https://mediathekviewweb.de/api/query"
query = {
    "queries": [
        {
            "fields": ["title", "topic"],
            "query": "sturm der liebe"
        },
        {
            "fields": ["channel"],
            "query": "ard"
        }
    ],
    "sortBy": "timestamp",
    "sortOrder": "desc",
    "future": False,
    "offset": 0,
    "size": 10,
    "duration_min": 20,
    "duration_max": 100
}

response = requests.post(url, json=query)
if response.status_code == 200:
    data = response.json()
    print(data)
else:
    print(f"请求失败,状态码:{response.status_code}")
    print(response.json())

写法二:手动序列化并使用data参数

完全对齐JavaScript示例的请求方式,手动控制序列化过程并设置请求头:

import requests
import json

url = "https://mediathekviewweb.de/api/query"
query = {
    "queries": [
        {
            "fields": ["title", "topic"],
            "query": "sturm der liebe"
        },
        {
            "fields": ["channel"],
            "query": "ard"
        }
    ],
    "sortBy": "timestamp",
    "sortOrder": "desc",
    "future": False,
    "offset": 0,
    "size": 10,
    "duration_min": 20,
    "duration_max": 100
}

query_string = json.dumps(query)
headers = {"Content-Type": "text/plain"}  # 匹配JS示例的请求头类型
response = requests.post(url, data=query_string, headers=headers)
if response.status_code == 200:
    data = response.json()
    print(data)
else:
    print(f"请求失败,状态码:{response.status_code}")
    print(response.json())

说明

  • 写法一依赖requests内置能力,是更推荐的Python请求方式。
  • 写法二完全复刻JS请求逻辑,确保请求格式与示例一致。
  • Python中的布尔值False(首字母大写)会被requests自动转换为JSON标准的false,无需手动修改。

内容的提问来源于stack exchange,提问作者pflaf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:55:16