调用NIH Reporter API时Python Requests挂起但cURL正常求助
解决NIH Reporter API POST请求挂起问题
问题出在Python代码中错误地将字典转为字符串传给data参数,没有让Requests库正确处理JSON序列化,导致API无法解析请求体进而挂起。
问题分析
- cURL命令中,shell会正确处理包裹的JSON字符串(API兼容该格式);
- 但Python里
str(data)会把字典转成{'key': 'value'}格式的字符串,其中的单引号、字典内多余的末尾逗号都会导致JSON格式错误,API无法识别请求内容,最终请求一直等待正确输入而挂起。
修复后的代码
直接使用Requests的json参数传入字典,它会自动完成JSON序列化,还能自动设置正确的Content-Type(可省略手动设置的该请求头):
import requests headers = { "accept": "application/json" } data = { "criteria": { "award_notice_date": { "from_date": "2022-06-22" # 移除多余的末尾逗号,避免序列化异常 } }, "include_fields": [ "ProjectNum", "ProjectTitle", "AbstractText", "AwardNoticeDate" ], "offset": 14500, "limit": 500, "sort_field": "award_notice_date" } # 用json参数替代data=str(data) response = requests.post('https://api.reporter.nih.gov/v2/projects/search', headers=headers, json=data) # 建议添加超时参数,避免请求无限挂起 # response = requests.post('https://api.reporter.nih.gov/v2/projects/search', headers=headers, json=data, timeout=30)
额外提示
- 清理字典中多余的末尾逗号,虽然Python语法允许,但可能引发序列化问题;
- 若必须手动序列化JSON,使用
json.dumps(data)替代str(data),但json参数是更简洁可靠的方式; - 始终添加
timeout参数,防止因网络或API异常导致请求长时间挂起。
内容的提问来源于stack exchange,提问作者Rapid Readers
相关产品推荐
相关产品推荐

