调用德国公共广播媒体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
相关产品推荐
相关产品推荐

