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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:40:36